├── .gitignore
├── GitHubUpdate.sln
├── GitHubUpdate
├── GitHubUpdate.csproj
├── GitHubUpdate.nuspec
├── Helper.cs
├── Properties
│ └── AssemblyInfo.cs
├── UpdateChecker.cs
├── UpdateNotifyDialog.Designer.cs
├── UpdateNotifyDialog.cs
└── packages.config
├── LICENSE
├── README.md
└── Sample
├── App.config
├── Program.cs
├── Properties
├── AssemblyInfo.cs
├── Resources.Designer.cs
├── Resources.resx
├── Settings.Designer.cs
└── Settings.settings
├── Sample.Designer.cs
├── Sample.cs
├── Sample.csproj
└── Sample.resx
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.sln.docstates
8 |
9 | # Build results
10 | [Dd]ebug/
11 | [Dd]ebugPublic/
12 | [Rr]elease/
13 | x64/
14 | build/
15 | bld/
16 | [Bb]in/
17 | [Oo]bj/
18 |
19 | # MSTest test Results
20 | [Tt]est[Rr]esult*/
21 | [Bb]uild[Ll]og.*
22 |
23 | #NUNIT
24 | *.VisualState.xml
25 | TestResult.xml
26 |
27 | # Build Results of an ATL Project
28 | [Dd]ebugPS/
29 | [Rr]eleasePS/
30 | dlldata.c
31 |
32 | *_i.c
33 | *_p.c
34 | *_i.h
35 | *.ilk
36 | *.meta
37 | *.obj
38 | *.pch
39 | *.pdb
40 | *.pgc
41 | *.pgd
42 | *.rsp
43 | *.sbr
44 | *.tlb
45 | *.tli
46 | *.tlh
47 | *.tmp
48 | *.tmp_proj
49 | *.log
50 | *.vspscc
51 | *.vssscc
52 | .builds
53 | *.pidb
54 | *.svclog
55 | *.scc
56 |
57 | # Chutzpah Test files
58 | _Chutzpah*
59 |
60 | # Visual C++ cache files
61 | ipch/
62 | *.aps
63 | *.ncb
64 | *.opensdf
65 | *.sdf
66 | *.cachefile
67 |
68 | # Visual Studio profiler
69 | *.psess
70 | *.vsp
71 | *.vspx
72 |
73 | # TFS 2012 Local Workspace
74 | $tf/
75 |
76 | # Guidance Automation Toolkit
77 | *.gpState
78 |
79 | # ReSharper is a .NET coding add-in
80 | _ReSharper*/
81 | *.[Rr]e[Ss]harper
82 | *.DotSettings.user
83 |
84 | # JustCode is a .NET coding addin-in
85 | .JustCode
86 |
87 | # TeamCity is a build add-in
88 | _TeamCity*
89 |
90 | # DotCover is a Code Coverage Tool
91 | *.dotCover
92 |
93 | # NCrunch
94 | *.ncrunch*
95 | _NCrunch_*
96 | .*crunch*.local.xml
97 |
98 | # MightyMoose
99 | *.mm.*
100 | AutoTest.Net/
101 |
102 | # Web workbench (sass)
103 | .sass-cache/
104 |
105 | # Installshield output folder
106 | [Ee]xpress/
107 |
108 | # DocProject is a documentation generator add-in
109 | DocProject/buildhelp/
110 | DocProject/Help/*.HxT
111 | DocProject/Help/*.HxC
112 | DocProject/Help/*.hhc
113 | DocProject/Help/*.hhk
114 | DocProject/Help/*.hhp
115 | DocProject/Help/Html2
116 | DocProject/Help/html
117 |
118 | # Click-Once directory
119 | publish/
120 |
121 | # Publish Web Output
122 | *.[Pp]ublish.xml
123 | *.azurePubxml
124 |
125 | # NuGet Packages Directory
126 | packages/
127 | ## TODO: If the tool you use requires repositories.config uncomment the next line
128 | #!packages/repositories.config
129 |
130 | # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
131 | # This line needs to be after the ignore of the build folder (and the packages folder if the line above has been uncommented)
132 | !packages/build/
133 |
134 | # Windows Azure Build Output
135 | csx/
136 | *.build.csdef
137 |
138 | # Windows Store app package directory
139 | AppPackages/
140 |
141 | # Others
142 | sql/
143 | *.Cache
144 | ClientBin/
145 | [Ss]tyle[Cc]op.*
146 | ~$*
147 | *~
148 | *.dbmdl
149 | *.dbproj.schemaview
150 | *.pfx
151 | *.publishsettings
152 | node_modules/
153 |
154 | # RIA/Silverlight projects
155 | Generated_Code/
156 |
157 | # Backup & report files from converting an old project file to a newer
158 | # Visual Studio version. Backup files are not needed, because we have git ;-)
159 | _UpgradeReport_Files/
160 | Backup*/
161 | UpgradeLog*.XML
162 | UpgradeLog*.htm
163 |
164 | # SQL Server files
165 | *.mdf
166 | *.ldf
167 |
168 | # Business Intelligence projects
169 | *.rdl.data
170 | *.bim.layout
171 | *.bim_*.settings
172 |
173 | # Microsoft Fakes
174 | FakesAssemblies/
175 | *.nupkg
176 |
--------------------------------------------------------------------------------
/GitHubUpdate.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2013
4 | VisualStudioVersion = 12.0.30501.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitHubUpdate", "GitHubUpdate\GitHubUpdate.csproj", "{D3121CDD-5BBD-4EF9-A268-8F2C0FDB900A}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample", "Sample\Sample.csproj", "{9F5F6485-4CCB-4EB2-849D-593067663AFB}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {D3121CDD-5BBD-4EF9-A268-8F2C0FDB900A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {D3121CDD-5BBD-4EF9-A268-8F2C0FDB900A}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {D3121CDD-5BBD-4EF9-A268-8F2C0FDB900A}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {D3121CDD-5BBD-4EF9-A268-8F2C0FDB900A}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {9F5F6485-4CCB-4EB2-849D-593067663AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {9F5F6485-4CCB-4EB2-849D-593067663AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {9F5F6485-4CCB-4EB2-849D-593067663AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {9F5F6485-4CCB-4EB2-849D-593067663AFB}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | EndGlobal
29 |
--------------------------------------------------------------------------------
/GitHubUpdate/GitHubUpdate.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {D3121CDD-5BBD-4EF9-A268-8F2C0FDB900A}
8 | Library
9 | Properties
10 | GitHubUpdate
11 | GitHubUpdate
12 | v4.5
13 | 512
14 |
15 |
16 | true
17 | full
18 | false
19 | bin\Debug\
20 | DEBUG;TRACE
21 | prompt
22 | 4
23 |
24 |
25 | pdbonly
26 | true
27 | bin\Release\
28 | TRACE
29 | prompt
30 | 4
31 |
32 |
33 |
34 | ..\packages\Octokit.0.3.4\lib\net45\Octokit.dll
35 |
36 |
37 | ..\packages\semver.1.1.2\lib\net45\Semver.dll
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | Form
48 |
49 |
50 | UpdateNotifyDialog.cs
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
66 |
--------------------------------------------------------------------------------
/GitHubUpdate/GitHubUpdate.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $id$
5 | $version$
6 | $title$
7 | $author$
8 | $author$
9 | https://raw.githubusercontent.com/nixxquality/GitHubUpdateCheck/master/LICENSE
10 | https://github.com/nixxquality/GitHubUpdateCheck/
11 | false
12 | $description$
13 | Copyright 2014, 2015
14 |
15 |
16 |
--------------------------------------------------------------------------------
/GitHubUpdate/Helper.cs:
--------------------------------------------------------------------------------
1 | using Semver;
2 | using System;
3 |
4 | namespace GitHubUpdate
5 | {
6 | #region stolen code
7 | // https://github.com/octokit/octokit.net/blob/master/Octokit/Helpers/Ensure.cs
8 |
9 | partial class Helper
10 | {
11 | public static void ArgumentNotNull([ValidatedNotNull]object value, string name)
12 | {
13 | if (value != null) return;
14 |
15 | throw new ArgumentNullException(name);
16 | }
17 | public static void ArgumentNotNullOrEmptyString([ValidatedNotNull]string value, string name)
18 | {
19 | ArgumentNotNull(value, name);
20 | if (!string.IsNullOrWhiteSpace(value)) return;
21 |
22 | throw new ArgumentException("String cannot be empty", name);
23 | }
24 | }
25 |
26 | [AttributeUsage(AttributeTargets.Parameter)]
27 | internal sealed class ValidatedNotNullAttribute : Attribute
28 | {
29 | }
30 |
31 | #endregion
32 |
33 | internal static partial class Helper
34 | {
35 | public static SemVersion StripInitialV(string version)
36 | {
37 | if (version[0] == 'v')
38 | version = version.Substring(1);
39 |
40 | SemVersion result = SemVersion.Parse(version);
41 |
42 | return result;
43 | }
44 | }
45 | }
--------------------------------------------------------------------------------
/GitHubUpdate/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 | using System.Resources;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("GitHub Update Check")]
10 | [assembly: AssemblyDescription("Easily check if your program is up to date, using GitHub Releases")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("nixx quality")]
13 | [assembly: AssemblyProduct("GitHubUpdate")]
14 | [assembly: AssemblyCopyright("Copyright © nixx quality 2014, 2015")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 |
18 | // Setting ComVisible to false makes the types in this assembly not visible
19 | // to COM components. If you need to access a type in this assembly from
20 | // COM, set the ComVisible attribute to true on that type.
21 | [assembly: ComVisible(false)]
22 |
23 | // The following GUID is for the ID of the typelib if this project is exposed to COM
24 | [assembly: Guid("747a3829-ff9f-461e-8dbb-e606e98fa25e")]
25 |
26 | // Version information for an assembly consists of the following four values:
27 | //
28 | // Major Version
29 | // Minor Version
30 | // Build Number
31 | // Revision
32 | //
33 | // You can specify all the values or you can default the Build and Revision Numbers
34 | // by using the '*' as shown below:
35 | // [assembly: AssemblyVersion("1.0.*")]
36 | [assembly: AssemblyVersion("1.2.0")]
37 | [assembly: NeutralResourcesLanguageAttribute("en")]
38 |
--------------------------------------------------------------------------------
/GitHubUpdate/UpdateChecker.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 |
4 | using Octokit;
5 | using Semver;
6 | using System.Threading.Tasks;
7 |
8 | namespace GitHubUpdate
9 | {
10 | public enum UpdateType
11 | {
12 | None,
13 | Major,
14 | Minor,
15 | Patch
16 | }
17 |
18 | public class UpdateChecker
19 | {
20 | private IReleasesClient _releaseClient;
21 | internal GitHubClient Github;
22 |
23 | internal SemVersion CurrentVersion;
24 | internal string RepositoryOwner;
25 | internal string RepostoryName;
26 | internal Release LatestRelease;
27 |
28 | void Init(string owner, string name, SemVersion version)
29 | {
30 | Github = new GitHubClient(new ProductHeaderValue(name + @"-UpdateCheck"));
31 | _releaseClient = Github.Release;
32 |
33 | RepositoryOwner = owner;
34 | RepostoryName = name;
35 | CurrentVersion = version;
36 | }
37 |
38 | public UpdateChecker(string owner, string name)
39 | {
40 | Helper.ArgumentNotNullOrEmptyString(owner, @"owner");
41 | Helper.ArgumentNotNullOrEmptyString(name, @"name");
42 |
43 | string version = System.Windows.Forms.Application.ProductVersion;
44 |
45 | version = version.Substring(0, version.LastIndexOf('.'));
46 |
47 | Init(owner, name, version);
48 | }
49 |
50 | public UpdateChecker(string owner, string name, string version)
51 | {
52 | Helper.ArgumentNotNullOrEmptyString(owner, @"owner");
53 | Helper.ArgumentNotNullOrEmptyString(name, @"name");
54 | Helper.ArgumentNotNullOrEmptyString(version, @"version");
55 |
56 | Init(owner, name, Helper.StripInitialV(version));
57 | }
58 |
59 | public async Task CheckUpdate(UpdateType locked = UpdateType.None)
60 | {
61 | var releases = await _releaseClient.GetAll(RepositoryOwner, RepostoryName);
62 |
63 | SemVersion lockedVersion;
64 | switch (locked)
65 | {
66 | case UpdateType.Major:
67 | lockedVersion = new SemVersion(CurrentVersion.Major + 1);
68 | LatestRelease = releases.FirstOrDefault(
69 | release => !release.Prerelease &&
70 | Helper.StripInitialV(release.TagName) > CurrentVersion &&
71 | Helper.StripInitialV(release.TagName) < lockedVersion
72 | );
73 | break;
74 | case UpdateType.Minor:
75 | lockedVersion = new SemVersion(CurrentVersion.Major, CurrentVersion.Minor + 1);
76 | LatestRelease = releases.FirstOrDefault(
77 | release => !release.Prerelease &&
78 | Helper.StripInitialV(release.TagName) > CurrentVersion &&
79 | Helper.StripInitialV(release.TagName) < lockedVersion
80 | );
81 | break;
82 | default:
83 | LatestRelease = releases.FirstOrDefault(
84 | release => !release.Prerelease &&
85 | Helper.StripInitialV(release.TagName) > CurrentVersion
86 | );
87 | break;
88 | }
89 |
90 | if (LatestRelease == null) return UpdateType.None;
91 |
92 | var tagName = LatestRelease.TagName;
93 | var latestVersion = Helper.StripInitialV(tagName);
94 |
95 | if (latestVersion.Major != CurrentVersion.Major)
96 | return UpdateType.Major;
97 | if (latestVersion.Minor != CurrentVersion.Minor)
98 | return UpdateType.Minor;
99 | if (latestVersion.Patch != CurrentVersion.Patch)
100 | return UpdateType.Patch;
101 |
102 | return UpdateType.None;
103 | }
104 |
105 | public async Task RenderReleaseNotes()
106 | {
107 | if (LatestRelease == null)
108 | throw new InvalidOperationException();
109 |
110 | return await Github.Miscellaneous.RenderRawMarkdown(LatestRelease.Body);
111 | }
112 |
113 | public /*async*/ void DownloadAsset(string assetname)
114 | {
115 | // asset.Url is some api wizardry that we'll maybe use later
116 | //var assets = await _releaseClient.GetAssets(RepositoryOwner, RepostoryName, LatestRelease.Id);
117 | //var asset = assets.First(n => n.Name == assetname);
118 |
119 | // for now, do some ugly shit
120 | const string template = "https://github.com/{0}/{1}/releases/download/{2}/{3}";
121 | var url = string.Format(template, RepositoryOwner, RepostoryName, LatestRelease.TagName, assetname);
122 |
123 | System.Diagnostics.Process.Start(url);
124 | }
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/GitHubUpdate/UpdateNotifyDialog.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace GitHubUpdate
2 | {
3 | partial class UpdateNotifyDialog
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | System.Windows.Forms.Button buttonNo;
32 | System.Windows.Forms.Button buttonYes;
33 | this.label1 = new System.Windows.Forms.Label();
34 | this.label2 = new System.Windows.Forms.Label();
35 | this.panel1 = new System.Windows.Forms.Panel();
36 | this.ReleaseNotesPanel = new System.Windows.Forms.Panel();
37 | this.boxReleaseNotes = new System.Windows.Forms.CheckBox();
38 | this.ReleaseNotes = new System.Windows.Forms.WebBrowser();
39 | buttonNo = new System.Windows.Forms.Button();
40 | buttonYes = new System.Windows.Forms.Button();
41 | this.panel1.SuspendLayout();
42 | this.ReleaseNotesPanel.SuspendLayout();
43 | this.SuspendLayout();
44 | //
45 | // label1
46 | //
47 | this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
48 | this.label1.AutoSize = true;
49 | this.label1.Location = new System.Drawing.Point(3, 9);
50 | this.label1.Name = "label1";
51 | this.label1.Size = new System.Drawing.Size(191, 13);
52 | this.label1.TabIndex = 0;
53 | this.label1.Text = "There is a new version of {0} available!";
54 | this.label1.TextAlign = System.Drawing.ContentAlignment.TopCenter;
55 | //
56 | // label2
57 | //
58 | this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
59 | this.label2.AutoSize = true;
60 | this.label2.Location = new System.Drawing.Point(3, 22);
61 | this.label2.Name = "label2";
62 | this.label2.Size = new System.Drawing.Size(175, 13);
63 | this.label2.TabIndex = 1;
64 | this.label2.Text = "Would you like to download it now?";
65 | this.label2.TextAlign = System.Drawing.ContentAlignment.TopCenter;
66 | //
67 | // buttonNo
68 | //
69 | buttonNo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
70 | buttonNo.DialogResult = System.Windows.Forms.DialogResult.No;
71 | buttonNo.Location = new System.Drawing.Point(205, 55);
72 | buttonNo.Name = "buttonNo";
73 | buttonNo.Size = new System.Drawing.Size(75, 23);
74 | buttonNo.TabIndex = 2;
75 | buttonNo.Text = "No";
76 | buttonNo.UseVisualStyleBackColor = true;
77 | //
78 | // buttonYes
79 | //
80 | buttonYes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
81 | buttonYes.DialogResult = System.Windows.Forms.DialogResult.Yes;
82 | buttonYes.Location = new System.Drawing.Point(286, 55);
83 | buttonYes.Name = "buttonYes";
84 | buttonYes.Size = new System.Drawing.Size(75, 23);
85 | buttonYes.TabIndex = 1;
86 | buttonYes.Text = "Yes";
87 | buttonYes.UseVisualStyleBackColor = true;
88 | //
89 | // panel1
90 | //
91 | this.panel1.Controls.Add(this.boxReleaseNotes);
92 | this.panel1.Controls.Add(buttonNo);
93 | this.panel1.Controls.Add(this.label2);
94 | this.panel1.Controls.Add(buttonYes);
95 | this.panel1.Controls.Add(this.label1);
96 | this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
97 | this.panel1.Location = new System.Drawing.Point(0, 0);
98 | this.panel1.Name = "panel1";
99 | this.panel1.Size = new System.Drawing.Size(374, 90);
100 | this.panel1.TabIndex = 5;
101 | this.panel1.Resize += new System.EventHandler(this.panel1_Resize);
102 | //
103 | // ReleaseNotesPanel
104 | //
105 | this.ReleaseNotesPanel.Controls.Add(this.ReleaseNotes);
106 | this.ReleaseNotesPanel.Location = new System.Drawing.Point(-1, 89);
107 | this.ReleaseNotesPanel.Name = "ReleaseNotesPanel";
108 | this.ReleaseNotesPanel.Size = new System.Drawing.Size(399, 187);
109 | this.ReleaseNotesPanel.TabIndex = 6;
110 | this.ReleaseNotesPanel.Visible = false;
111 | //
112 | // boxReleaseNotes
113 | //
114 | this.boxReleaseNotes.Appearance = System.Windows.Forms.Appearance.Button;
115 | this.boxReleaseNotes.AutoSize = true;
116 | this.boxReleaseNotes.Location = new System.Drawing.Point(10, 57);
117 | this.boxReleaseNotes.Name = "boxReleaseNotes";
118 | this.boxReleaseNotes.Size = new System.Drawing.Size(79, 23);
119 | this.boxReleaseNotes.TabIndex = 3;
120 | this.boxReleaseNotes.Text = "What\'s new?";
121 | this.boxReleaseNotes.UseVisualStyleBackColor = true;
122 | this.boxReleaseNotes.CheckedChanged += new System.EventHandler(this.boxReleaseNotes_CheckedChanged);
123 | //
124 | // ReleaseNotes
125 | //
126 | this.ReleaseNotes.AllowNavigation = false;
127 | this.ReleaseNotes.AllowWebBrowserDrop = false;
128 | this.ReleaseNotes.Dock = System.Windows.Forms.DockStyle.Fill;
129 | this.ReleaseNotes.IsWebBrowserContextMenuEnabled = false;
130 | this.ReleaseNotes.Location = new System.Drawing.Point(0, 0);
131 | this.ReleaseNotes.MinimumSize = new System.Drawing.Size(20, 20);
132 | this.ReleaseNotes.Name = "ReleaseNotes";
133 | this.ReleaseNotes.ScriptErrorsSuppressed = true;
134 | this.ReleaseNotes.Size = new System.Drawing.Size(399, 187);
135 | this.ReleaseNotes.TabIndex = 0;
136 | this.ReleaseNotes.WebBrowserShortcutsEnabled = false;
137 | //
138 | // UpdateNotifyDialog
139 | //
140 | this.AcceptButton = buttonYes;
141 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
142 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
143 | this.AutoSize = true;
144 | this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
145 | this.CancelButton = buttonNo;
146 | this.ClientSize = new System.Drawing.Size(374, 277);
147 | this.ControlBox = false;
148 | this.Controls.Add(this.ReleaseNotesPanel);
149 | this.Controls.Add(this.panel1);
150 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
151 | this.MinimumSize = new System.Drawing.Size(320, 0);
152 | this.Name = "UpdateNotifyDialog";
153 | this.Text = "Update available!";
154 | this.panel1.ResumeLayout(false);
155 | this.panel1.PerformLayout();
156 | this.ReleaseNotesPanel.ResumeLayout(false);
157 | this.ResumeLayout(false);
158 |
159 | }
160 |
161 | #endregion
162 |
163 | private System.Windows.Forms.Panel panel1;
164 | private System.Windows.Forms.Panel ReleaseNotesPanel;
165 | private System.Windows.Forms.Label label1;
166 | private System.Windows.Forms.Label label2;
167 | private System.Windows.Forms.CheckBox boxReleaseNotes;
168 | private System.Windows.Forms.WebBrowser ReleaseNotes;
169 |
170 | }
171 | }
--------------------------------------------------------------------------------
/GitHubUpdate/UpdateNotifyDialog.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace GitHubUpdate
5 | {
6 | public partial class UpdateNotifyDialog : Form
7 | {
8 | private readonly UpdateChecker _checker;
9 | private bool _loadednotes;
10 |
11 | public UpdateNotifyDialog(UpdateChecker checker)
12 | {
13 | _checker = checker;
14 |
15 | InitializeComponent();
16 |
17 | label1.Text = string.Format(label1.Text, checker.RepostoryName);
18 | }
19 |
20 | void panel1_Resize(object sender, EventArgs e)
21 | {
22 | label1.Left = (panel1.ClientSize.Width - label1.Width) / 2;
23 | label2.Left = (panel1.ClientSize.Width - label2.Width) / 2;
24 | }
25 |
26 | async void boxReleaseNotes_CheckedChanged(object sender, EventArgs e)
27 | {
28 | ReleaseNotesPanel.Visible = boxReleaseNotes.Checked;
29 |
30 | if (_loadednotes) return;
31 |
32 | ReleaseNotes.DocumentText = await _checker.RenderReleaseNotes();
33 | _loadednotes = true;
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/GitHubUpdate/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | GitHub Update [](http://www.repostatus.org/#unsupported)
2 | =============
3 |
4 | **This project has been abandoned** by the owner as I do not use GitHub anymore. Feel free to fork and improve it, if you'd like.
5 |
6 | If you want to take over the NuGet package, go ahead and contact me at nixx@is-fantabulo.us.
7 |
8 | --------------
9 |
10 | Easy way to check if your C# program is up to date using GitHub Releases
11 |
12 | Installing
13 | ----------
14 | ```
15 | PM> Install-Package GitHubUpdate
16 | ```
17 |
18 | Example
19 | -------
20 | ```csharp
21 | var checker = new UpdateChecker("nixxquality", "WebMConverter") // uses your Application.ProductVersion
22 |
23 | UpdateType update = await checker.CheckUpdate();
24 |
25 | if (update == UpdateType.None)
26 | {
27 | // Up to date!
28 | }
29 | else
30 | {
31 | // Ask the user if he wants to update
32 | // You can use the prebuilt form for this if you want (it's really pretty!)
33 | var result = new UpdateNotifyDialog(checker).ShowDialog();
34 | if (result == DialogResult.Yes)
35 | {
36 | checker.DownloadAsset("Converter.zip"); // opens it in the user's browser
37 | }
38 | }
39 | ```
40 | See also the Sample project included in the repository.
41 |
--------------------------------------------------------------------------------
/Sample/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Sample/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace Sample
5 | {
6 | static class Program
7 | {
8 | ///
9 | /// The main entry point for the application.
10 | ///
11 | [STAThread]
12 | static void Main()
13 | {
14 | Application.EnableVisualStyles();
15 | Application.SetCompatibleTextRenderingDefault(false);
16 | Application.Run(new Sample());
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Sample/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("Sample")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("Sample")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("ed630a37-f064-4d5d-baed-d14b85e6217e")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/Sample/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.34014
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace Sample.Properties
12 | {
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources
26 | {
27 |
28 | private static global::System.Resources.ResourceManager resourceMan;
29 |
30 | private static global::System.Globalization.CultureInfo resourceCulture;
31 |
32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33 | internal Resources()
34 | {
35 | }
36 |
37 | ///
38 | /// Returns the cached ResourceManager instance used by this class.
39 | ///
40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41 | internal static global::System.Resources.ResourceManager ResourceManager
42 | {
43 | get
44 | {
45 | if ((resourceMan == null))
46 | {
47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Sample.Properties.Resources", typeof(Resources).Assembly);
48 | resourceMan = temp;
49 | }
50 | return resourceMan;
51 | }
52 | }
53 |
54 | ///
55 | /// Overrides the current thread's CurrentUICulture property for all
56 | /// resource lookups using this strongly typed resource class.
57 | ///
58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59 | internal static global::System.Globalization.CultureInfo Culture
60 | {
61 | get
62 | {
63 | return resourceCulture;
64 | }
65 | set
66 | {
67 | resourceCulture = value;
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/Sample/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/Sample/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.34014
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace Sample.Properties
12 | {
13 |
14 |
15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18 | {
19 |
20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21 |
22 | public static Settings Default
23 | {
24 | get
25 | {
26 | return defaultInstance;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Sample/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Sample/Sample.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace Sample
2 | {
3 | partial class Sample
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | System.Windows.Forms.Button Check;
32 | this.label1 = new System.Windows.Forms.Label();
33 | this.label2 = new System.Windows.Forms.Label();
34 | this.label4 = new System.Windows.Forms.Label();
35 | this.label3 = new System.Windows.Forms.Label();
36 | this.User = new System.Windows.Forms.TextBox();
37 | this.Repo = new System.Windows.Forms.TextBox();
38 | this.Version = new System.Windows.Forms.TextBox();
39 | this.Asset = new System.Windows.Forms.TextBox();
40 | this.ProductVersion = new System.Windows.Forms.CheckBox();
41 | this.label5 = new System.Windows.Forms.Label();
42 | this.Lock = new System.Windows.Forms.ComboBox();
43 | Check = new System.Windows.Forms.Button();
44 | this.SuspendLayout();
45 | //
46 | // Check
47 | //
48 | Check.Location = new System.Drawing.Point(251, 81);
49 | Check.Name = "Check";
50 | Check.Size = new System.Drawing.Size(75, 23);
51 | Check.TabIndex = 0;
52 | Check.Text = "Check";
53 | Check.UseVisualStyleBackColor = true;
54 | Check.Click += new System.EventHandler(this.Check);
55 | //
56 | // label1
57 | //
58 | this.label1.AutoSize = true;
59 | this.label1.Location = new System.Drawing.Point(12, 9);
60 | this.label1.Name = "label1";
61 | this.label1.Size = new System.Drawing.Size(29, 13);
62 | this.label1.TabIndex = 1;
63 | this.label1.Text = "User";
64 | //
65 | // label2
66 | //
67 | this.label2.AutoSize = true;
68 | this.label2.Location = new System.Drawing.Point(12, 36);
69 | this.label2.Name = "label2";
70 | this.label2.Size = new System.Drawing.Size(33, 13);
71 | this.label2.TabIndex = 2;
72 | this.label2.Text = "Repo";
73 | //
74 | // label4
75 | //
76 | this.label4.AutoSize = true;
77 | this.label4.Location = new System.Drawing.Point(177, 9);
78 | this.label4.Name = "label4";
79 | this.label4.Size = new System.Drawing.Size(149, 13);
80 | this.label4.TabIndex = 5;
81 | this.label4.Text = "Pretend that we\'re this version";
82 | //
83 | // label3
84 | //
85 | this.label3.AutoSize = true;
86 | this.label3.Location = new System.Drawing.Point(12, 62);
87 | this.label3.Name = "label3";
88 | this.label3.Size = new System.Drawing.Size(33, 13);
89 | this.label3.TabIndex = 9;
90 | this.label3.Text = "Asset";
91 | //
92 | // User
93 | //
94 | this.User.Location = new System.Drawing.Point(53, 6);
95 | this.User.Name = "User";
96 | this.User.Size = new System.Drawing.Size(100, 20);
97 | this.User.TabIndex = 3;
98 | this.User.Text = "nixxquality";
99 | //
100 | // Repo
101 | //
102 | this.Repo.Location = new System.Drawing.Point(53, 33);
103 | this.Repo.Name = "Repo";
104 | this.Repo.Size = new System.Drawing.Size(100, 20);
105 | this.Repo.TabIndex = 4;
106 | this.Repo.Text = "WebMConverter";
107 | //
108 | // Version
109 | //
110 | this.Version.Location = new System.Drawing.Point(180, 33);
111 | this.Version.Name = "Version";
112 | this.Version.Size = new System.Drawing.Size(138, 20);
113 | this.Version.TabIndex = 8;
114 | this.Version.Text = "1.0";
115 | //
116 | // Asset
117 | //
118 | this.Asset.Location = new System.Drawing.Point(53, 59);
119 | this.Asset.Name = "Asset";
120 | this.Asset.Size = new System.Drawing.Size(100, 20);
121 | this.Asset.TabIndex = 10;
122 | this.Asset.Text = "Converter.zip";
123 | //
124 | // ProductVersion
125 | //
126 | this.ProductVersion.AutoSize = true;
127 | this.ProductVersion.Location = new System.Drawing.Point(159, 59);
128 | this.ProductVersion.Name = "ProductVersion";
129 | this.ProductVersion.Size = new System.Drawing.Size(175, 17);
130 | this.ProductVersion.TabIndex = 11;
131 | this.ProductVersion.Text = "Use Application.ProductVersion";
132 | this.ProductVersion.UseVisualStyleBackColor = true;
133 | this.ProductVersion.CheckedChanged += new System.EventHandler(this.ProductVersion_CheckedChanged);
134 | //
135 | // label5
136 | //
137 | this.label5.AutoSize = true;
138 | this.label5.Location = new System.Drawing.Point(12, 88);
139 | this.label5.Name = "label5";
140 | this.label5.Size = new System.Drawing.Size(31, 13);
141 | this.label5.TabIndex = 12;
142 | this.label5.Text = "Lock";
143 | //
144 | // Lock
145 | //
146 | this.Lock.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
147 | this.Lock.FormattingEnabled = true;
148 | this.Lock.Items.AddRange(new object[] {
149 | "None",
150 | "Major",
151 | "Minor"});
152 | this.Lock.Location = new System.Drawing.Point(53, 85);
153 | this.Lock.Name = "Lock";
154 | this.Lock.Size = new System.Drawing.Size(100, 21);
155 | this.Lock.TabIndex = 13;
156 | //
157 | // Sample
158 | //
159 | this.AcceptButton = Check;
160 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
161 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
162 | this.ClientSize = new System.Drawing.Size(333, 114);
163 | this.Controls.Add(this.Lock);
164 | this.Controls.Add(this.label5);
165 | this.Controls.Add(this.ProductVersion);
166 | this.Controls.Add(this.Asset);
167 | this.Controls.Add(this.label3);
168 | this.Controls.Add(this.Version);
169 | this.Controls.Add(this.label4);
170 | this.Controls.Add(this.Repo);
171 | this.Controls.Add(this.User);
172 | this.Controls.Add(this.label2);
173 | this.Controls.Add(this.label1);
174 | this.Controls.Add(Check);
175 | this.Name = "Sample";
176 | this.Text = "Sample";
177 | this.ResumeLayout(false);
178 | this.PerformLayout();
179 |
180 | }
181 |
182 | #endregion
183 |
184 | private System.Windows.Forms.TextBox User;
185 | private System.Windows.Forms.TextBox Repo;
186 | private System.Windows.Forms.TextBox Version;
187 | private System.Windows.Forms.TextBox Asset;
188 | private System.Windows.Forms.Label label1;
189 | private System.Windows.Forms.Label label2;
190 | private System.Windows.Forms.Label label4;
191 | private System.Windows.Forms.Label label3;
192 | private new System.Windows.Forms.CheckBox ProductVersion;
193 | private System.Windows.Forms.Label label5;
194 | private System.Windows.Forms.ComboBox Lock;
195 | }
196 | }
197 |
198 |
--------------------------------------------------------------------------------
/Sample/Sample.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | using GitHubUpdate;
5 |
6 | namespace Sample
7 | {
8 | public partial class Sample : Form
9 | {
10 | public Sample()
11 | {
12 | InitializeComponent();
13 | Lock.SelectedIndex = 0;
14 | }
15 |
16 | void Check(object sender, EventArgs e)
17 | {
18 | UpdateChecker checker;
19 | if (ProductVersion.Checked)
20 | {
21 | checker = new UpdateChecker(User.Text, Repo.Text);
22 | }
23 | else
24 | {
25 | checker = new UpdateChecker(User.Text, Repo.Text, Version.Text);
26 | }
27 |
28 | ((Button)sender).Enabled = false;
29 | checker.CheckUpdate(locked: (UpdateType)Lock.SelectedIndex).ContinueWith(continuation =>
30 | {
31 | // if (continuation.Result == UpdateType.None)
32 | // return;
33 |
34 | Invoke(new Action(() => // Go back to the UI thread
35 | {
36 | ((Button)sender).Enabled = true;
37 | if (continuation.Result != UpdateType.None)
38 | {
39 | var result = new UpdateNotifyDialog(checker).ShowDialog();
40 | if (result == DialogResult.Yes)
41 | {
42 | checker.DownloadAsset(Asset.Text);
43 | }
44 | }
45 | else
46 | {
47 | MessageBox.Show("Up to date!");
48 | }
49 | }));
50 | });
51 | }
52 |
53 | void ProductVersion_CheckedChanged(object sender, EventArgs e)
54 | {
55 | Version.Enabled = !ProductVersion.Checked;
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/Sample/Sample.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {9F5F6485-4CCB-4EB2-849D-593067663AFB}
8 | WinExe
9 | Properties
10 | Sample
11 | Sample
12 | v4.5
13 | 512
14 |
15 |
16 | AnyCPU
17 | true
18 | full
19 | false
20 | bin\Debug\
21 | DEBUG;TRACE
22 | prompt
23 | 4
24 |
25 |
26 | AnyCPU
27 | pdbonly
28 | true
29 | bin\Release\
30 | TRACE
31 | prompt
32 | 4
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | Form
42 |
43 |
44 | Sample.cs
45 |
46 |
47 |
48 |
49 | ResXFileCodeGenerator
50 | Resources.Designer.cs
51 | Designer
52 |
53 |
54 | True
55 | Resources.resx
56 |
57 |
58 | Sample.cs
59 |
60 |
61 | SettingsSingleFileGenerator
62 | Settings.Designer.cs
63 |
64 |
65 | True
66 | Settings.settings
67 | True
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | {d3121cdd-5bbd-4ef9-a268-8f2c0fdb900a}
76 | GitHubUpdate
77 |
78 |
79 |
80 |
87 |
--------------------------------------------------------------------------------
/Sample/Sample.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | False
122 |
123 |
--------------------------------------------------------------------------------