1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-10-30 14:46:19 +00:00
TiddlyWiki5/core/modules/savers/gitlab.js

118 lines
3.1 KiB
JavaScript
Raw Normal View History

Add GitLab saver, apply common lingo to Git savers (#3931) * Transform GitHub saver to work with GitLab as well You can choose which provider you want to use, the data is given in the same place. I tried to avoid code duplication, so service providers' unique properties are in separate files, the settings of the selected provider are loaded. In two fields I am not sure that it fits into the current structure: * module-type: gitservice Which module is a `gitservice` type, it will be listed in the drop-down menu. * default-api-url: https://gitlab.com/api/v4 The default URL to access the provider's API. This is just a sketch, not a final version, suggestions for modification are welcome! * Rename saver from GitHub to GitService, update docs * Split GitHub and GitLab to separate savers, apply common lingo Sadly, it doesn't seem to make much sense to search for common parts in the code, because there might be a Git service that is very different from the GitHub API (such as BitBucket). Therefore, I feel that Git savers are not able to share other than the translations. I deleted the defaults values from the translations and set it to the text entry because they should not depend on the translations. * Add more information about the password field It is not clear how to create a personal access token, thus added a link to the help pages. In addition, GitLab only accepts personal access token, GitHub also accepts the password, so I made this clear. * Extract commit message to lingo * Fix indentation * Use improved base64 encoder Fix conflict with a06acc4eb8ade26cbb17b9f5911876bac1da7715
2019-07-31 20:38:52 +00:00
/*\
title: $:/core/modules/savers/gitlab.js
type: application/javascript
module-type: saver
Saves wiki by pushing a commit to the GitLab REST API
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: true */
"use strict";
/*
Select the appropriate saver module and set it up
*/
var GitLabSaver = function(wiki) {
this.wiki = wiki;
};
GitLabSaver.prototype.save = function(text,method,callback) {
/* See https://docs.gitlab.com/ee/api/repository_files.html */
var self = this,
username = this.wiki.getTiddlerText("$:/GitLab/Username"),
password = $tw.utils.getPassword("gitlab"),
repo = this.wiki.getTiddlerText("$:/GitLab/Repo"),
path = this.wiki.getTiddlerText("$:/GitLab/Path",""),
Add GitLab saver, apply common lingo to Git savers (#3931) * Transform GitHub saver to work with GitLab as well You can choose which provider you want to use, the data is given in the same place. I tried to avoid code duplication, so service providers' unique properties are in separate files, the settings of the selected provider are loaded. In two fields I am not sure that it fits into the current structure: * module-type: gitservice Which module is a `gitservice` type, it will be listed in the drop-down menu. * default-api-url: https://gitlab.com/api/v4 The default URL to access the provider's API. This is just a sketch, not a final version, suggestions for modification are welcome! * Rename saver from GitHub to GitService, update docs * Split GitHub and GitLab to separate savers, apply common lingo Sadly, it doesn't seem to make much sense to search for common parts in the code, because there might be a Git service that is very different from the GitHub API (such as BitBucket). Therefore, I feel that Git savers are not able to share other than the translations. I deleted the defaults values from the translations and set it to the text entry because they should not depend on the translations. * Add more information about the password field It is not clear how to create a personal access token, thus added a link to the help pages. In addition, GitLab only accepts personal access token, GitHub also accepts the password, so I made this clear. * Extract commit message to lingo * Fix indentation * Use improved base64 encoder Fix conflict with a06acc4eb8ade26cbb17b9f5911876bac1da7715
2019-07-31 20:38:52 +00:00
filename = this.wiki.getTiddlerText("$:/GitLab/Filename"),
branch = this.wiki.getTiddlerText("$:/GitLab/Branch") || "master",
endpoint = this.wiki.getTiddlerText("$:/GitLab/ServerURL") || "https://gitlab.com/api/v4",
headers = {
"Content-Type": "application/json;charset=UTF-8",
"Private-Token": password
};
// Bail if we don't have everything we need
if(!username || !password || !repo || !filename) {
Add GitLab saver, apply common lingo to Git savers (#3931) * Transform GitHub saver to work with GitLab as well You can choose which provider you want to use, the data is given in the same place. I tried to avoid code duplication, so service providers' unique properties are in separate files, the settings of the selected provider are loaded. In two fields I am not sure that it fits into the current structure: * module-type: gitservice Which module is a `gitservice` type, it will be listed in the drop-down menu. * default-api-url: https://gitlab.com/api/v4 The default URL to access the provider's API. This is just a sketch, not a final version, suggestions for modification are welcome! * Rename saver from GitHub to GitService, update docs * Split GitHub and GitLab to separate savers, apply common lingo Sadly, it doesn't seem to make much sense to search for common parts in the code, because there might be a Git service that is very different from the GitHub API (such as BitBucket). Therefore, I feel that Git savers are not able to share other than the translations. I deleted the defaults values from the translations and set it to the text entry because they should not depend on the translations. * Add more information about the password field It is not clear how to create a personal access token, thus added a link to the help pages. In addition, GitLab only accepts personal access token, GitHub also accepts the password, so I made this clear. * Extract commit message to lingo * Fix indentation * Use improved base64 encoder Fix conflict with a06acc4eb8ade26cbb17b9f5911876bac1da7715
2019-07-31 20:38:52 +00:00
return false;
}
// Make sure the path start and ends with a slash
if(path.substring(0,1) !== "/") {
path = "/" + path;
}
if(path.substring(path.length - 1) !== "/") {
path = path + "/";
}
// Compose the base URI
var uri = endpoint + "/projects/" + encodeURIComponent(repo) + "/repository/";
// Perform a get request to get the details (inc shas) of files in the same path as our file
$tw.utils.httpRequest({
url: uri + "tree/?path=" + encodeURIComponent(path.replace(/^\/+|\/$/g, '')) + "&branch=" + encodeURIComponent(branch.replace(/^\/+|\/$/g, '')),
Add GitLab saver, apply common lingo to Git savers (#3931) * Transform GitHub saver to work with GitLab as well You can choose which provider you want to use, the data is given in the same place. I tried to avoid code duplication, so service providers' unique properties are in separate files, the settings of the selected provider are loaded. In two fields I am not sure that it fits into the current structure: * module-type: gitservice Which module is a `gitservice` type, it will be listed in the drop-down menu. * default-api-url: https://gitlab.com/api/v4 The default URL to access the provider's API. This is just a sketch, not a final version, suggestions for modification are welcome! * Rename saver from GitHub to GitService, update docs * Split GitHub and GitLab to separate savers, apply common lingo Sadly, it doesn't seem to make much sense to search for common parts in the code, because there might be a Git service that is very different from the GitHub API (such as BitBucket). Therefore, I feel that Git savers are not able to share other than the translations. I deleted the defaults values from the translations and set it to the text entry because they should not depend on the translations. * Add more information about the password field It is not clear how to create a personal access token, thus added a link to the help pages. In addition, GitLab only accepts personal access token, GitHub also accepts the password, so I made this clear. * Extract commit message to lingo * Fix indentation * Use improved base64 encoder Fix conflict with a06acc4eb8ade26cbb17b9f5911876bac1da7715
2019-07-31 20:38:52 +00:00
type: "GET",
headers: headers,
callback: function(err,getResponseDataJson,xhr) {
var getResponseData,sha = "";
if(err && xhr.status !== 404) {
return callback(err);
}
var requestType = "POST";
if(xhr.status !== 404) {
getResponseData = JSON.parse(getResponseDataJson);
$tw.utils.each(getResponseData,function(details) {
if(details.name === filename) {
requestType = "PUT";
sha = details.sha;
}
});
}
var data = {
commit_message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"),
content: text,
Add GitLab saver, apply common lingo to Git savers (#3931) * Transform GitHub saver to work with GitLab as well You can choose which provider you want to use, the data is given in the same place. I tried to avoid code duplication, so service providers' unique properties are in separate files, the settings of the selected provider are loaded. In two fields I am not sure that it fits into the current structure: * module-type: gitservice Which module is a `gitservice` type, it will be listed in the drop-down menu. * default-api-url: https://gitlab.com/api/v4 The default URL to access the provider's API. This is just a sketch, not a final version, suggestions for modification are welcome! * Rename saver from GitHub to GitService, update docs * Split GitHub and GitLab to separate savers, apply common lingo Sadly, it doesn't seem to make much sense to search for common parts in the code, because there might be a Git service that is very different from the GitHub API (such as BitBucket). Therefore, I feel that Git savers are not able to share other than the translations. I deleted the defaults values from the translations and set it to the text entry because they should not depend on the translations. * Add more information about the password field It is not clear how to create a personal access token, thus added a link to the help pages. In addition, GitLab only accepts personal access token, GitHub also accepts the password, so I made this clear. * Extract commit message to lingo * Fix indentation * Use improved base64 encoder Fix conflict with a06acc4eb8ade26cbb17b9f5911876bac1da7715
2019-07-31 20:38:52 +00:00
branch: branch,
sha: sha
};
// Perform a request to save the file
$tw.utils.httpRequest({
url: uri + "files/" + encodeURIComponent(path.replace(/^\/+/, '') + filename),
type: requestType,
headers: headers,
data: JSON.stringify(data),
callback: function(err,putResponseDataJson,xhr) {
if(err) {
return callback(err);
}
var putResponseData = JSON.parse(putResponseDataJson);
callback(null);
}
});
}
});
return true;
};
/*
Information about this saver
*/
GitLabSaver.prototype.info = {
name: "gitlab",
priority: 2000,
capabilities: ["save", "autosave"]
};
/*
Static method that returns true if this saver is capable of working
*/
exports.canSave = function(wiki) {
return true;
};
/*
Create an instance of this saver
*/
exports.create = function(wiki) {
return new GitLabSaver(wiki);
};
})();