File: gh_deploy.py

package info (click to toggle)
python-mkdocs 1.1.2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,832 kB
  • sloc: python: 7,504; javascript: 2,299; perl: 142; sh: 66; makefile: 25; xml: 21
file content (134 lines) | stat: -rw-r--r-- 4,766 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import logging
import subprocess
import os
import re
from pkg_resources import parse_version

import mkdocs
from mkdocs.utils import ghp_import

log = logging.getLogger(__name__)

default_message = """Deployed {sha} with MkDocs version: {version}"""


def _is_cwd_git_repo():
    try:
        proc = subprocess.Popen(
            ['git', 'rev-parse', '--is-inside-work-tree'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
    except FileNotFoundError:
        log.error("Could not find git - is it installed and on your path?")
        raise SystemExit(1)
    proc.communicate()
    return proc.wait() == 0


def _get_current_sha(repo_path):

    proc = subprocess.Popen(['git', 'rev-parse', '--short', 'HEAD'], cwd=repo_path,
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    stdout, _ = proc.communicate()
    sha = stdout.decode('utf-8').strip()
    return sha


def _get_remote_url(remote_name):

    # No CNAME found.  We will use the origin URL to determine the GitHub
    # pages location.
    remote = "remote.%s.url" % remote_name
    proc = subprocess.Popen(["git", "config", "--get", remote],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    stdout, _ = proc.communicate()
    url = stdout.decode('utf-8').strip()

    host = None
    path = None
    if 'github.com/' in url:
        host, path = url.split('github.com/', 1)
    elif 'github.com:' in url:
        host, path = url.split('github.com:', 1)

    return host, path


def _check_version(branch):

    proc = subprocess.Popen(['git', 'show', '-s', '--format=%s', 'refs/heads/{}'.format(branch)],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    stdout, _ = proc.communicate()
    msg = stdout.decode('utf-8').strip()
    m = re.search(r'\d+(\.\d+)+((a|b|rc)\d+)?(\.post\d+)?(\.dev\d+)?', msg, re.X | re.I)
    previousv = parse_version(m.group()) if m else None
    currentv = parse_version(mkdocs.__version__)
    if not previousv:
        log.warning('Version check skipped: No version specified in previous deployment.')
    elif currentv > previousv:
        log.info(
            'Previous deployment was done with MkDocs version {}; '
            'you are deploying with a newer version ({})'.format(previousv, currentv)
        )
    elif currentv < previousv:
        log.error(
            'Deployment terminated: Previous deployment was made with MkDocs version {}; '
            'you are attempting to deploy with an older version ({}). Use --ignore-version '
            'to deploy anyway.'.format(previousv, currentv)
        )
        raise SystemExit(1)


def gh_deploy(config, message=None, force=False, ignore_version=False):

    if not _is_cwd_git_repo():
        log.error('Cannot deploy - this directory does not appear to be a git '
                  'repository')

    remote_branch = config['remote_branch']
    remote_name = config['remote_name']

    if not ignore_version:
        _check_version(remote_branch)

    if message is None:
        message = default_message
    sha = _get_current_sha(os.path.dirname(config.config_file_path))
    message = message.format(version=mkdocs.__version__, sha=sha)

    log.info("Copying '%s' to '%s' branch and pushing to GitHub.",
             config['site_dir'], config['remote_branch'])

    result, error = ghp_import.ghp_import(config['site_dir'], message, remote_name,
                                          remote_branch, force)
    if not result:
        log.error("Failed to deploy to GitHub with error: \n%s", error)
        raise SystemExit(1)
    else:
        cname_file = os.path.join(config['site_dir'], 'CNAME')
        # Does this repository have a CNAME set for GitHub pages?
        if os.path.isfile(cname_file):
            # This GitHub pages repository has a CNAME configured.
            with(open(cname_file, 'r')) as f:
                cname_host = f.read().strip()
            log.info('Based on your CNAME file, your documentation should be '
                     'available shortly at: http://%s', cname_host)
            log.info('NOTE: Your DNS records must be configured appropriately for '
                     'your CNAME URL to work.')
            return

        host, path = _get_remote_url(remote_name)

        if host is None:
            # This could be a GitHub Enterprise deployment.
            log.info('Your documentation should be available shortly.')
        else:
            username, repo = path.split('/', 1)
            if repo.endswith('.git'):
                repo = repo[:-len('.git')]
            url = 'https://{}.github.io/{}/'.format(username, repo)
            log.info('Your documentation should shortly be available at: ' + url)