void updateLink(ShellLink shortcut, string newAppPath) { this.Log().Info("Processing shortcut '{0}'", shortcut.ShortCutFile); var target = Environment.ExpandEnvironmentVariables(shortcut.Target); var targetIsUpdateDotExe = target.EndsWith("update.exe", StringComparison.OrdinalIgnoreCase); this.Log().Info("Old shortcut target: '{0}'", target); if (!targetIsUpdateDotExe) { target = Path.Combine(rootAppDirectory, Path.GetFileName(shortcut.Target)); } else { target = Path.Combine(rootAppDirectory, Path.GetFileName(shortcut.IconPath)); } this.Log().Info("New shortcut target: '{0}'", target); shortcut.WorkingDirectory = newAppPath; shortcut.Target = target; this.Log().Info("Old iconPath is: '{0}'", shortcut.IconPath); shortcut.IconPath = target; shortcut.IconIndex = 0; this.ErrorIfThrows(() => Utility.Retry(() => shortcut.Save(), 2), "Couldn't write shortcut " + shortcut.ShortCutFile); this.Log().Info("Finished shortcut successfully"); }
public void CreateShortcutsForExecutable(string exeName, ShortcutLocation locations, bool updateOnly) { var releases = Utility.LoadLocalReleases(Utility.LocalReleaseFileForAppDir(rootAppDirectory)); var thisRelease = Utility.FindCurrentVersion(releases); var zf = new ZipPackage(Path.Combine( Utility.PackageDirectoryForAppDir(rootAppDirectory), thisRelease.Filename)); var exePath = Path.Combine(Utility.AppDirForRelease(rootAppDirectory, thisRelease), exeName); var fileVerInfo = FileVersionInfo.GetVersionInfo(exePath); foreach (var f in (ShortcutLocation[])Enum.GetValues(typeof(ShortcutLocation))) { if (!locations.HasFlag(f)) { continue; } var file = linkTargetForVersionInfo(f, zf, fileVerInfo); var fileExists = File.Exists(file); // NB: If we've already installed the app, but the shortcut // is no longer there, we have to assume that the user didn't // want it there and explicitly deleted it, so we shouldn't // annoy them by recreating it. if (!fileExists && updateOnly) { this.Log().Warn("Wanted to update shortcut {0} but it appears user deleted it", file); continue; } this.Log().Info("Creating shortcut for {0} => {1}", exeName, file); this.ErrorIfThrows(() => { if (fileExists) { File.Delete(file); } var sl = new ShellLink { Target = exePath, IconPath = exePath, IconIndex = 0, WorkingDirectory = Path.GetDirectoryName(exePath), Description = zf.Description, }; this.Log().Info("About to save shortcut: {0}", file); if (ModeDetector.InUnitTestRunner() == false) { sl.Save(file); } }, "Can't write shortcut: " + file); } }
void updateLink(ShellLink shortcut, string newAppPath) { this.Log().Info("Processing shortcut '{0}'", shortcut.ShortCutFile); var target = Environment.ExpandEnvironmentVariables(shortcut.Target); var targetIsUpdateDotExe = target.EndsWith("update.exe", StringComparison.OrdinalIgnoreCase); this.Log().Info("Old shortcut target: '{0}'", target); if (!targetIsUpdateDotExe) { target = Path.Combine(newAppPath, Path.GetFileName(shortcut.Target)); } this.Log().Info("New shortcut target: '{0}'", target); shortcut.WorkingDirectory = newAppPath; shortcut.Target = target; // NB: If the executable was in a previous version but not in this // one, we should disappear this pin. if (!File.Exists(target)) { shortcut.Dispose(); this.ErrorIfThrows(() => Utility.DeleteFileHarder(target), "Failed to delete outdated pinned shortcut to: " + target); return; } this.Log().Info("Old iconPath is: '{0}'", shortcut.IconPath); if (!File.Exists(shortcut.IconPath) || shortcut.IconPath.IndexOf("app-", StringComparison.OrdinalIgnoreCase) > 1) { var iconPath = Path.Combine(newAppPath, Path.GetFileName(shortcut.IconPath)); if (!File.Exists(iconPath) && targetIsUpdateDotExe) { var executable = shortcut.Arguments.Replace("--processStart ", ""); iconPath = Path.Combine(newAppPath, executable); } this.Log().Info("Setting iconPath to: '{0}'", iconPath); shortcut.IconPath = iconPath; if (!File.Exists(iconPath)) { this.Log().Warn("Tried to use {0} for icon path but didn't exist, falling back to EXE", iconPath); shortcut.IconPath = target; shortcut.IconIndex = 0; } } this.ErrorIfThrows(() => Utility.Retry(() => shortcut.Save(), 2), "Couldn't write shortcut " + shortcut.ShortCutFile); this.Log().Info("Finished shortcut successfully"); }
void updateLink(ShellLink shortcut, string[] oldAppDirectories, string newAppPath) { this.Log().Info("Processing shortcut '{0}'", shortcut.Target); foreach (var oldAppDirectory in oldAppDirectories) { if (!shortcut.Target.StartsWith(oldAppDirectory, StringComparison.OrdinalIgnoreCase) && !shortcut.IconPath.StartsWith(oldAppDirectory, StringComparison.OrdinalIgnoreCase)) { this.Log().Info("Does not match '{0}', continuing to next directory", oldAppDirectory); continue; } // replace old app path with new app path and check, if executable still exists var newTarget = Path.Combine(newAppPath, shortcut.Target.Substring(oldAppDirectory.Length + 1)); if (File.Exists(newTarget)) { shortcut.Target = newTarget; // replace working directory too if appropriate if (shortcut.WorkingDirectory.StartsWith(oldAppDirectory, StringComparison.OrdinalIgnoreCase)) { this.Log().Info("Changing new directory to '{0}'", newAppPath); shortcut.WorkingDirectory = Path.Combine(newAppPath, shortcut.WorkingDirectory.Substring(oldAppDirectory.Length + 1)); } // replace working directory too if appropriate if (shortcut.IconPath.StartsWith(oldAppDirectory, StringComparison.OrdinalIgnoreCase)) { this.Log().Info("Changing new directory to '{0}'", newAppPath); shortcut.IconPath = Path.Combine(newAppPath, shortcut.IconPath.Substring(oldAppDirectory.Length + 1)); } shortcut.Save(); } else { this.Log().Info("Unpinning {0} from taskbar", shortcut.Target); TaskbarHelper.UnpinFromTaskbar(shortcut.Target); } break; } }
void updateLink(ShellLink shortcut, string newAppPath) { this.Log().Info("Processing shortcut '{0}'", shortcut.ShortCutFile); var target = Environment.ExpandEnvironmentVariables(shortcut.Target); var targetIsUpdateDotExe = target.EndsWith("update.exe", StringComparison.OrdinalIgnoreCase); this.Log().Info("Old shortcut target: '{0}'", target); // NB: In 1.5.0 we accidentally fixed the target of pinned shortcuts but left the arguments, // so if we find a shortcut with --processStart in the args, we're gonna stomp it even though // what we _should_ do is stomp it only if the target is Update.exe if (shortcut.Arguments.Contains("--processStart")) { shortcut.Arguments = ""; } if (!targetIsUpdateDotExe) { target = Path.Combine(rootAppDirectory, Path.GetFileName(shortcut.Target)); } else { target = Path.Combine(rootAppDirectory, Path.GetFileName(shortcut.IconPath)); } this.Log().Info("New shortcut target: '{0}'", target); shortcut.WorkingDirectory = newAppPath; shortcut.Target = target; this.Log().Info("Old iconPath is: '{0}'", shortcut.IconPath); shortcut.IconPath = target; shortcut.IconIndex = 0; this.ErrorIfThrows(() => Utility.Retry(() => shortcut.Save(), 2), "Couldn't write shortcut " + shortcut.ShortCutFile); this.Log().Info("Finished shortcut successfully"); }
void updateLink(ShellLink shortcut, string newAppPath, bool newVersionExists) { string expectedStart = rootAppDirectory + "\\app-"; if (!shortcut.WorkingDirectory.StartsWith(expectedStart, StringComparison.OrdinalIgnoreCase)) { return; } if (!newVersionExists) { this.Log().Info("Unpinning {0} from taskbar", shortcut.ShortCutFile); TaskbarHelper.UnpinFromTaskbar(shortcut.Target); return; } shortcut.Target = updatePath(shortcut.Target, newAppPath); shortcut.WorkingDirectory = updatePath(shortcut.WorkingDirectory, newAppPath); shortcut.IconPath = updatePath(shortcut.IconPath, newAppPath); this.Log().Info("Updating shortcut {0}", shortcut.ShortCutFile); shortcut.Save(); }
public void CreateShortcutsForExecutable(string exeName, ShortcutLocation locations, bool updateOnly, string programArguments, string icon) { this.Log().Info("About to create shortcuts for {0}, rootAppDir {1}", exeName, rootAppDirectory); var releases = Utility.LoadLocalReleases(Utility.LocalReleaseFileForAppDir(rootAppDirectory)); var thisRelease = Utility.FindCurrentVersion(releases); var zf = new ZipPackage(Path.Combine( Utility.PackageDirectoryForAppDir(rootAppDirectory), thisRelease.Filename)); var exePath = Path.Combine(Utility.AppDirForRelease(rootAppDirectory, thisRelease), exeName); var fileVerInfo = FileVersionInfo.GetVersionInfo(exePath); foreach (var f in (ShortcutLocation[])Enum.GetValues(typeof(ShortcutLocation))) { if (!locations.HasFlag(f)) { continue; } var file = linkTargetForVersionInfo(f, zf, fileVerInfo); var fileExists = File.Exists(file); // NB: If we've already installed the app, but the shortcut // is no longer there, we have to assume that the user didn't // want it there and explicitly deleted it, so we shouldn't // annoy them by recreating it. if (!fileExists && updateOnly) { this.Log().Warn("Wanted to update shortcut {0} but it appears user deleted it", file); continue; } this.Log().Info("Creating shortcut for {0} => {1}", exeName, file); ShellLink sl; this.ErrorIfThrows(() => Utility.Retry(() => { File.Delete(file); var target = Path.Combine(rootAppDirectory, exeName); sl = new ShellLink { Target = target, IconPath = icon ?? target, IconIndex = 0, WorkingDirectory = Path.GetDirectoryName(exePath), Description = zf.Description, }; if (!String.IsNullOrWhiteSpace(programArguments)) { sl.Arguments += String.Format(" -a \"{0}\"", programArguments); } var appUserModelId = String.Format("com.squirrel.{0}.{1}", zf.Id.Replace(" ", ""), exeName.Replace(".exe", "").Replace(" ", "")); var toastActivatorCLSID = Utility.CreateGuidFromHash(appUserModelId).ToString(); sl.SetAppUserModelId(appUserModelId); sl.SetToastActivatorCLSID(toastActivatorCLSID); this.Log().Info("About to save shortcut: {0} (target {1}, workingDir {2}, args {3}, toastActivatorCSLID {4})", file, sl.Target, sl.WorkingDirectory, sl.Arguments, toastActivatorCLSID); if (ModeDetector.InUnitTestRunner() == false) { sl.Save(file); } }, 4), "Can't write shortcut: " + file); } fixPinnedExecutables(zf.Version); }
public void CreateShortcutsForExecutable(string exeName, ShortcutLocation locations, bool updateOnly) { this.Log().Info("About to create shortcuts for {0}, rootAppDir {1}", exeName, rootAppDirectory); var releases = Utility.LoadLocalReleases(Utility.LocalReleaseFileForAppDir(rootAppDirectory)); var thisRelease = Utility.FindCurrentVersion(releases); var updateExe = Path.Combine(rootAppDirectory, "update.exe"); var zf = new ZipPackage(Path.Combine( Utility.PackageDirectoryForAppDir(rootAppDirectory), thisRelease.Filename)); var exePath = Path.Combine(Utility.AppDirForRelease(rootAppDirectory, thisRelease), exeName); var fileVerInfo = FileVersionInfo.GetVersionInfo(exePath); foreach (var f in (ShortcutLocation[])Enum.GetValues(typeof(ShortcutLocation))) { if (!locations.HasFlag(f)) { continue; } var file = linkTargetForVersionInfo(f, zf, fileVerInfo); var fileExists = File.Exists(file); // NB: If we've already installed the app, but the shortcut // is no longer there, we have to assume that the user didn't // want it there and explicitly deleted it, so we shouldn't // annoy them by recreating it. if (!fileExists && updateOnly) { this.Log().Warn("Wanted to update shortcut {0} but it appears user deleted it", file); continue; } this.Log().Info("Creating shortcut for {0} => {1}", exeName, file); ShellLink sl; this.ErrorIfThrows(() => { if (fileExists) { try { sl = new ShellLink(); sl.Open(file); if (sl.Target == updateExe && sl.Description == zf.Description && sl.IconPath == exePath) { return; } File.Delete(file); } catch (Exception ex) { this.Log().WarnException("Tried to compare shortcut and failed", ex); File.Delete(file); } } sl = new ShellLink { Target = updateExe, IconPath = exePath, IconIndex = 0, WorkingDirectory = Path.GetDirectoryName(exePath), Description = zf.Description, Arguments = "--processStart " + exeName, }; sl.SetAppUserModelId(String.Format("com.squirrel.{0}.{1}", zf.Id, exeName.Replace(".exe", ""))); this.Log().Info("About to save shortcut: {0} (target {1}, workingDir {2}, args {3})", file, sl.Target, sl.WorkingDirectory, sl.Arguments); if (ModeDetector.InUnitTestRunner() == false) { sl.Save(file); } }, "Can't write shortcut: " + file); } }
void updateLink(ShellLink shortcut, string[] oldAppDirectories, string newAppPath) { this.Log().Info("Processing shortcut '{0}'", shortcut.Target); foreach (var oldAppDirectory in oldAppDirectories) { if (!shortcut.Target.StartsWith(oldAppDirectory, StringComparison.OrdinalIgnoreCase)) { this.Log().Info("Does not match '{0}', continuing to next directory", oldAppDirectory); continue; } // replace old app path with new app path and check, if executable still exists var newTarget = Path.Combine(newAppPath, shortcut.Target.Substring(oldAppDirectory.Length + 1)); if (File.Exists(newTarget)) { shortcut.Target = newTarget; // replace working directory too if appropriate if (shortcut.WorkingDirectory.StartsWith(oldAppDirectory, StringComparison.OrdinalIgnoreCase)) { this.Log().Info("Changing new directory to '{0}'", newAppPath); shortcut.WorkingDirectory = Path.Combine(newAppPath, shortcut.WorkingDirectory.Substring(oldAppDirectory.Length + 1)); } shortcut.Save(); } else { this.Log().Info("Unpinning {0} from taskbar", shortcut.Target); TaskbarHelper.UnpinFromTaskbar(shortcut.Target); } break; } }
public void CreateShortcutsForExecutable(string exeName, ShortcutLocation locations, bool updateOnly) { var releases = Utility.LoadLocalReleases(Utility.LocalReleaseFileForAppDir(rootAppDirectory)); var thisRelease = Utility.FindCurrentVersion(releases); var zf = new ZipPackage(Path.Combine( Utility.PackageDirectoryForAppDir(rootAppDirectory), thisRelease.Filename)); var exePath = Path.Combine(Utility.AppDirForRelease(rootAppDirectory, thisRelease), exeName); var fileVerInfo = FileVersionInfo.GetVersionInfo(exePath); foreach (var f in (ShortcutLocation[]) Enum.GetValues(typeof(ShortcutLocation))) { if (!locations.HasFlag(f)) continue; var file = linkTargetForVersionInfo(f, zf, fileVerInfo); var fileExists = File.Exists(file); // NB: If we've already installed the app, but the shortcut // is no longer there, we have to assume that the user didn't // want it there and explicitly deleted it, so we shouldn't // annoy them by recreating it. if (!fileExists && updateOnly) { this.Log().Warn("Wanted to update shortcut {0} but it appears user deleted it", file); continue; } this.Log().Info("Creating shortcut for {0} => {1}", exeName, file); this.ErrorIfThrows(() => { if (fileExists) File.Delete(file); var sl = new ShellLink { Target = exePath, IconPath = exePath, IconIndex = 0, WorkingDirectory = Path.GetDirectoryName(exePath), Description = zf.Description, }; this.Log().Info("About to save shortcut: {0}", file); if (ModeDetector.InUnitTestRunner() == false) sl.Save(file); }, "Can't write shortcut: " + file); } }