nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
nulltoken edited this page Apr 19, 2013 · 21 revisions

Welcome to the LibGit2Sharp project wiki!

If you are interested in contributing to the development of this project we would love to have your help. Please take a moment to read through the contributing guide below.

General Support and Questions

  • If you've found a bug, want a new feature, please use the issue tracker
  • You've got a usage or programming related questions, please direct it to StackOverflow

Documentation

Let's put it simply: we currently lack proper documentation. Any help on this subject would be greatly appreciated ;-)

General usage

  • What is Git? Read the online book Pro Git.
  • The LibGit2Sharp Hitchhiker's Guide to Git should provide you with C# code snippets demonstrating the LibGit2Sharp API
  • You may find also some help in understanding how to use LibGit2Sharp by browsing the tests.

API documentation

We rely on Xml documentation comments to describe types and methods. This post shares some nice practices about it.

Contributing

  1. Configure your repo to convert line endings on commit so they are always LF (LineFeeds) in the repo. This requires changing the value of the core.autocrlf configuration entry. More information about this can been found on this help.github page.
  • On Windows:
$ git config --global core.autocrlf true
  • On Linux:
$ git config --global core.autocrlf input
  1. Fork the project on github and create a topic branch that is named after the feature you are implementing or the bug you are fixing. As the development is being done in the vNext branch, make sure to create your topic branch from the tip of it.
  2. Write tests, following the code style of the existing tests.
  3. Implement your feature or fix your bug. Please following existing coding styles and do not introduce new ones.
  4. Make atomic, focused commits with good commit messages.
  5. Make sure that feature commits are easy to review by separating code beautification proposals in dedicated commits (eg. code beautification commit).
  6. If you are using code from elsewhere (such as other open source projects, Stack Overflow posts, blog posts etc) then please make sure you give proper credit and a link to the source in your code comments. If you can then flag this fact in the pull request, we can double check we're doing everything to be compliant with how that person licensed their original code and their license is compatible with our very permissive MIT based open source license.
  7. Send a Pull Request targeting the vNext branch.

High Level Design Goals for the API

A lot of thought has gone into the current API design, please help keep things consistent. The following is a list of general guidelines for implementing new features in the API.

  1. The API should be intuitive, discoverable, and consistent.
  2. The Repository is intended to be the primary interface and root aggregate object for accessing all functionality. It is the only object that implements IDisposable.
  3. GitObjects like Tree, Tag, Blob, Commit should not implement IDisposable. The consumer should not have to worry about disposing these objects when they are returned from methods like repository.Lookup(sha).
  4. If you do have to implement IDisposable, please use the SafeHandle pattern.
  5. LibGit2Sharp should not be a 1:1 mapping of the libgit2 C API. This means that there maybe features in libgit2 that are not supported or are only exposed in a constrained manner.
  6. Sketch out the API design before implementing! Here is a good example of the initial API sketch done in a gist:
using(varrepo=newRepository("path\to\repo.git")){// Object lookupvarobj=repo.Lookup("sha");varcommit=repo.Lookup<Commit>("sha");vartree=repo.Lookup<Tree>("sha");vartag=repo.Lookup<Tag>("sha");// Rev walkingforeach(varcinrepo.Commits.Walk("sha")){}varcommits=repo.Commits.StartingAt("sha").Where(c =>c).ToList();varsortedCommits=repo.Commits.StartingAt("sha").SortBy(SortMode.Topo).ToList();// Refsvarreference=repo.Refs["refs/heads/master"];varallRefs=repo.Refs.ToList();foreach(varcinrepo.Refs["HEAD"].Commits){}foreach(varcinrepo.Head.Commits){}varheadCommit=repo.Head.Commits.First();varallCommits=repo.Refs["HEAD"].Commits.ToList();varnewRef=repo.Refs.CreateFrom(reference);varanotherNewRef=repo.Refs.CreateFrom("sha");// Branches// special kind of referencevarallBranches=repo.Branches.ToList();varbranch=repo.Branches["master"];varremoteBranch=repo.Branches["origin/master"];varlocalBranches=repo.Branches.Where(p =>p.Type==BranchType.Local).ToList();varremoteBranches=repo.Branches.Where(p =>p.Type==BranchType.Remote).ToList();varnewBranch=repo.Branches.CreateFrom("sha");varanotherNewBranch=repo.Branches.CreateFrom(newBranch);repo.Branches.Delete(anotherNewBranch);// Tags// really another special kind of referencevaraTag=repo.Tags["refs/tags/v1.0"];varallTags=repo.Tags.ToList();varnewTag=repo.Tags.CreateFrom("sha");varnewTag2=repo.Tags.CreateFrom(commit);varnewTag3=repo.Tags.CreateFrom(reference);}

In many cases, if you are implementing brand new parts of the API it is a good idea to sketch out how the API would be used by a consumer, post it somewhere like gists and ask for some feedback before diving in and implementing.

Clone this wiki locally