238 # import py2exe's patched Distribution class |
238 # import py2exe's patched Distribution class |
239 from distutils.core import Distribution |
239 from distutils.core import Distribution |
240 except ImportError: |
240 except ImportError: |
241 py2exeloaded = False |
241 py2exeloaded = False |
242 |
242 |
243 def runcmd(cmd, env): |
243 def runcmd(cmd, env, cwd=None): |
244 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
244 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, |
245 stderr=subprocess.PIPE, env=env) |
245 stderr=subprocess.PIPE, env=env, cwd=cwd) |
246 out, err = p.communicate() |
246 out, err = p.communicate() |
247 return p.returncode, out, err |
247 return p.returncode, out, err |
248 |
248 |
249 class hgcommand(object): |
249 class hgcommand(object): |
250 def __init__(self, cmd, env): |
250 def __init__(self, cmd, env): |
700 @property |
700 @property |
701 def hgexepath(self): |
701 def hgexepath(self): |
702 dir = os.path.dirname(self.get_ext_fullpath('dummy')) |
702 dir = os.path.dirname(self.get_ext_fullpath('dummy')) |
703 return os.path.join(self.build_temp, dir, 'hg.exe') |
703 return os.path.join(self.build_temp, dir, 'hg.exe') |
704 |
704 |
|
705 class hgbuilddoc(Command): |
|
706 description = 'build documentation' |
|
707 user_options = [ |
|
708 ('man', None, 'generate man pages'), |
|
709 ('html', None, 'generate html pages'), |
|
710 ] |
|
711 |
|
712 def initialize_options(self): |
|
713 self.man = None |
|
714 self.html = None |
|
715 |
|
716 def finalize_options(self): |
|
717 # If --man or --html are set, only generate what we're told to. |
|
718 # Otherwise generate everything. |
|
719 have_subset = self.man is not None or self.html is not None |
|
720 |
|
721 if have_subset: |
|
722 self.man = True if self.man else False |
|
723 self.html = True if self.html else False |
|
724 else: |
|
725 self.man = True |
|
726 self.html = True |
|
727 |
|
728 def run(self): |
|
729 def normalizecrlf(p): |
|
730 with open(p, 'rb') as fh: |
|
731 orig = fh.read() |
|
732 |
|
733 if b'\r\n' not in orig: |
|
734 return |
|
735 |
|
736 log.info('normalizing %s to LF line endings' % p) |
|
737 with open(p, 'wb') as fh: |
|
738 fh.write(orig.replace(b'\r\n', b'\n')) |
|
739 |
|
740 def gentxt(root): |
|
741 txt = 'doc/%s.txt' % root |
|
742 log.info('generating %s' % txt) |
|
743 res, out, err = runcmd( |
|
744 [sys.executable, 'gendoc.py', root], |
|
745 os.environ, |
|
746 cwd='doc') |
|
747 if res: |
|
748 raise SystemExit('error running gendoc.py: %s' % |
|
749 '\n'.join([out, err])) |
|
750 |
|
751 with open(txt, 'wb') as fh: |
|
752 fh.write(out) |
|
753 |
|
754 def gengendoc(root): |
|
755 gendoc = 'doc/%s.gendoc.txt' % root |
|
756 |
|
757 log.info('generating %s' % gendoc) |
|
758 res, out, err = runcmd( |
|
759 [sys.executable, 'gendoc.py', '%s.gendoc' % root], |
|
760 os.environ, |
|
761 cwd='doc') |
|
762 if res: |
|
763 raise SystemExit('error running gendoc: %s' % |
|
764 '\n'.join([out, err])) |
|
765 |
|
766 with open(gendoc, 'wb') as fh: |
|
767 fh.write(out) |
|
768 |
|
769 def genman(root): |
|
770 log.info('generating doc/%s' % root) |
|
771 res, out, err = runcmd( |
|
772 [sys.executable, 'runrst', 'hgmanpage', '--halt', 'warning', |
|
773 '--strip-elements-with-class', 'htmlonly', |
|
774 '%s.txt' % root, root], |
|
775 os.environ, |
|
776 cwd='doc') |
|
777 if res: |
|
778 raise SystemExit('error running runrst: %s' % |
|
779 '\n'.join([out, err])) |
|
780 |
|
781 normalizecrlf('doc/%s' % root) |
|
782 |
|
783 def genhtml(root): |
|
784 log.info('generating doc/%s.html' % root) |
|
785 res, out, err = runcmd( |
|
786 [sys.executable, 'runrst', 'html', '--halt', 'warning', |
|
787 '--link-stylesheet', '--stylesheet-path', 'style.css', |
|
788 '%s.txt' % root, '%s.html' % root], |
|
789 os.environ, |
|
790 cwd='doc') |
|
791 if res: |
|
792 raise SystemExit('error running runrst: %s' % |
|
793 '\n'.join([out, err])) |
|
794 |
|
795 normalizecrlf('doc/%s.html' % root) |
|
796 |
|
797 # This logic is duplicated in doc/Makefile. |
|
798 sources = {f for f in os.listdir('mercurial/help') |
|
799 if re.search('[0-9]\.txt$', f)} |
|
800 |
|
801 # common.txt is a one-off. |
|
802 gentxt('common') |
|
803 |
|
804 for source in sorted(sources): |
|
805 assert source[-4:] == '.txt' |
|
806 root = source[:-4] |
|
807 |
|
808 gentxt(root) |
|
809 gengendoc(root) |
|
810 |
|
811 if self.man: |
|
812 genman(root) |
|
813 if self.html: |
|
814 genhtml(root) |
|
815 |
705 class hginstall(install): |
816 class hginstall(install): |
706 |
817 |
707 user_options = install.user_options + [ |
818 user_options = install.user_options + [ |
708 ('old-and-unmanageable', None, |
819 ('old-and-unmanageable', None, |
709 'noop, present for eggless setuptools compat'), |
820 'noop, present for eggless setuptools compat'), |
825 data = data.replace(b'@LIBDIR@', libdir.encode(libdir_escape)) |
936 data = data.replace(b'@LIBDIR@', libdir.encode(libdir_escape)) |
826 with open(outfile, 'wb') as fp: |
937 with open(outfile, 'wb') as fp: |
827 fp.write(data) |
938 fp.write(data) |
828 |
939 |
829 cmdclass = {'build': hgbuild, |
940 cmdclass = {'build': hgbuild, |
|
941 'build_doc': hgbuilddoc, |
830 'build_mo': hgbuildmo, |
942 'build_mo': hgbuildmo, |
831 'build_ext': hgbuildext, |
943 'build_ext': hgbuildext, |
832 'build_py': hgbuildpy, |
944 'build_py': hgbuildpy, |
833 'build_scripts': hgbuildscripts, |
945 'build_scripts': hgbuildscripts, |
834 'build_hgextindex': buildhgextindex, |
946 'build_hgextindex': buildhgextindex, |