From 077b2181d9f8516d4476d85f339cd02fa6cbc8ad Mon Sep 17 00:00:00 2001 From: Karl Semich <0xloem@gmail.com> Date: Sun, 28 Aug 2016 02:50:52 -0400 Subject: Set correct last-edited-by times from git --- backend/TODO | 1 + backend/ikiwiki.setup | 27 +++++++++++++++++++++++++-- backend/resilient/__init__.py | 39 ++++++++++++++++++++++++++++++++------- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/backend/TODO b/backend/TODO index 3544369..1d9e4d5 100644 --- a/backend/TODO +++ b/backend/TODO @@ -10,6 +10,7 @@ [x] zeronet 8/27/16 [ ] zeronet public gateway [ ] ipfs + [ ] ipfs needs a server running. let's run only the private server get automatically if not present: (submodule or gpg) [x] DO ONE: [ ] ikiwiki diff --git a/backend/ikiwiki.setup b/backend/ikiwiki.setup index 0d71995..0153c4c 100644 --- a/backend/ikiwiki.setup +++ b/backend/ikiwiki.setup @@ -36,11 +36,13 @@ cgi_overload_message: '' # enable optimization of only refreshing committed changes? only_committed_changes: 0 # rcs backend to use -rcs: '' +rcs: git # plugins to add to the default configuration add_plugins: - ikistrap - repolist +- ikistrap +- repolist # plugins to disable disable_plugins: [] # additional directory to search for template files @@ -105,9 +107,30 @@ useragent: ikiwiki/3.20141016.3 ###################################################################### # core plugins -# (editpage, htmlscrubber, inline, link, meta, parentlinks, templatebody) +# (editpage, git, htmlscrubber, inline, link, meta, parentlinks, +# templatebody) ###################################################################### +# git plugin +# git hook to generate +#git_wrapper: /git/wiki.git/hooks/post-update +# shell command for git_wrapper to run, in the background +#git_wrapper_background_command: git push github +# mode for git_wrapper (can safely be made suid) +#git_wrappermode: 06755 +# git pre-receive hook to generate +#git_test_receive_wrapper: /git/wiki.git/hooks/pre-receive +# unix users whose commits should be checked by the pre-receive hook +#untrusted_committers: [] +# gitweb url to show file history ([[file]] substituted) +#historyurl: http://git.example.com/gitweb.cgi?p=wiki.git;a=history;f=[[file]];hb=HEAD +# gitweb url to show a diff ([[file]], [[sha1_to]], [[sha1_from]], [[sha1_commit]], and [[sha1_parent]] substituted) +#diffurl: http://git.example.com/gitweb.cgi?p=wiki.git;a=blobdiff;f=[[file]];h=[[sha1_to]];hp=[[sha1_from]];hb=[[sha1_commit]];hpb=[[sha1_parent]] +# where to pull and push changes (set to empty string to disable) +gitorigin_branch: origin +# branch that the wiki is stored in +gitmaster_branch: master + # htmlscrubber plugin # PageSpec specifying pages not to scrub #htmlscrubber_skip: '!*/Discussion' diff --git a/backend/resilient/__init__.py b/backend/resilient/__init__.py index 424c73c..c42b5d1 100644 --- a/backend/resilient/__init__.py +++ b/backend/resilient/__init__.py @@ -1,7 +1,9 @@ import fileinput import os +import shlex import shutil import subprocess +import sys import tempfile import time import urllib @@ -9,13 +11,14 @@ import urllib __all__ = ["freenet"] backend_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..')) +root_path = os.path.normpath(os.path.join(backend_path, '..')) auth_path = os.path.join(backend_path, 'auth') dep_path = os.path.join(backend_path, 'dep') -html_path = os.path.normpath(os.path.join(backend_path, '../html')) -wiki_src_path = os.path.normpath(os.path.join(backend_path, '../wiki')) ikiwiki_setup_path = os.path.join(backend_path, 'ikiwiki.setup') -git_path = os.path.normpath(os.path.join(backend_path, '../.git')) +html_path = os.path.normpath(os.path.join(root_path, 'html')) +wiki_src_path = os.path.normpath(os.path.join(root_path, 'wiki')) +git_path = os.path.normpath(os.path.join(root_path, '.git')) ssh_config_path = os.path.join(auth_path, "ssh-config") @@ -36,9 +39,31 @@ class git: if not found: print("ERROR: git not found") exit(1) - else: - os.system("git submodule init") - os.system("git submodule update") + + os.system("git submodule init") + os.system("git submodule update") + + # http://stackoverflow.com/questions/1964470/whats-the-equivalent-of-use-commit-times-for-git + # sets mtimes to last commit time, for ikiwiki 'last edited by' time + filelist = set() + for root, subdirs, files in os.walk(wiki_src_path): + for file in files: + filelist.add(os.path.relpath(os.path.join(root, file), root_path)) + mtime = 0 + gitobj = subprocess.Popen(shlex.split('git whatchanged --pretty=%at'), stdout=subprocess.PIPE) + for line in gitobj.stdout: + line = line.strip() + if not line: continue + if line.startswith(':'): + file = line.split('\t')[-1] + if file in filelist: + filelist.remove(file) + #print mtime, file + os.utime(os.path.join(root_path,file), (mtime, mtime)) + else: + mtime = long(line) + if not filelist: + break def __init__(self, remote, push_remote = ""): self.remote = remote @@ -80,7 +105,7 @@ class ikiwiki: shutil.rmtree(html_path) os.mkdir(html_path) - status = os.system("ikiwiki --rcs git --setup '%s' '%s' '%s'" % (ikiwiki_setup_path, wiki_src_path, html_path)) + status = os.system("ikiwiki --setup '%s' '%s' '%s'" % (ikiwiki_setup_path, wiki_src_path, html_path)) # workaround for ikistrap overwriting custom css files, which are included for freenet's filter os.system("git checkout -- '%s'/css" % html_path) -- cgit v1.2.3