From 6ee4509abf626f26ef56527ca0269614285a8404 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 25 Jan 2013 16:34:26 +0200 Subject: [PATCH 1/9] Support MS-Windows file names encoded in multibyte encodings. src/w32.c (w32_get_long_filename, init_environment, readlink): Support file names encoded in DBCS codepages. --- src/ChangeLog | 5 +++++ src/w32.c | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index e9c4fe0c50e..2294a473f53 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2013-01-25 Eli Zaretskii + + * w32.c (w32_get_long_filename, init_environment, readlink): + Support file names encoded in DBCS codepages. + 2013-01-23 Eli Zaretskii * w32.c (max_filename_mbslen): New function. diff --git a/src/w32.c b/src/w32.c index 51e304af1e9..98ec573f553 100644 --- a/src/w32.c +++ b/src/w32.c @@ -37,7 +37,7 @@ along with GNU Emacs. If not, see . */ /* must include CRT headers *before* config.h */ #include -#include /* for _mbspbrk and _mbslwr */ +#include /* for _mbspbrk, _mbslwr, _mbsrchr, ... */ #undef access #undef chdir @@ -1573,7 +1573,7 @@ w32_get_long_filename (char * name, char * buf, int size) while (p != NULL && *p) { q = p; - p = strchr (q, '\\'); + p = _mbschr (q, '\\'); if (p) *p = '\0'; len = get_long_basename (full, o, size); if (len > 0) @@ -1800,16 +1800,16 @@ init_environment (char ** argv) if (!GetModuleFileName (NULL, modname, MAX_PATH)) emacs_abort (); - if ((p = strrchr (modname, '\\')) == NULL) + if ((p = _mbsrchr (modname, '\\')) == NULL) emacs_abort (); *p = 0; - if ((p = strrchr (modname, '\\')) && xstrcasecmp (p, "\\bin") == 0) + if ((p = _mbsrchr (modname, '\\')) && xstrcasecmp (p, "\\bin") == 0) { char buf[SET_ENV_BUF_SIZE]; *p = 0; - for (p = modname; *p; p++) + for (p = modname; *p; p = CharNext (p)) if (*p == '\\') *p = '/'; _snprintf (buf, sizeof (buf)-1, "emacs_dir=%s", modname); @@ -1824,17 +1824,17 @@ init_environment (char ** argv) || xstrcasecmp (p, "\\AMD64") == 0)) { *p = 0; - p = strrchr (modname, '\\'); + p = _mbsrchr (modname, '\\'); if (p != NULL) { *p = 0; - p = strrchr (modname, '\\'); + p = _mbsrchr (modname, '\\'); if (p && xstrcasecmp (p, "\\src") == 0) { char buf[SET_ENV_BUF_SIZE]; *p = 0; - for (p = modname; *p; p++) + for (p = modname; *p; p = CharNext (p)) if (*p == '\\') *p = '/'; _snprintf (buf, sizeof (buf)-1, "emacs_dir=%s", modname); @@ -4340,18 +4340,34 @@ readlink (const char *name, char *buf, size_t buf_size) else { size_t size_to_copy = buf_size; - BYTE *p = lname; + BYTE *p = lname, *p2; BYTE *pend = p + lname_len; + int dbcs_p = max_filename_mbslen () > 1; /* Normalize like dostounix_filename does, but we don't want to assume that lname is null-terminated. */ - if (*p && p[1] == ':' && *p >= 'A' && *p <= 'Z') - *p += 'a' - 'A'; + if (dbcs_p) + p2 = CharNextExA (w32_ansi_code_page, p, 0); + else + p2 = p + 1; + if (*p && *p2 == ':' && *p >= 'A' && *p <= 'Z') + { + *p += 'a' - 'A'; + p += 2; + } while (p <= pend) { if (*p == '\\') *p = '/'; - ++p; + if (dbcs_p) + { + p = CharNextExA (w32_ansi_code_page, p, 0); + /* CharNextExA doesn't advance at null character. */ + if (!*p) + break; + } + else + ++p; } /* Testing for null-terminated LNAME is paranoia: WideCharToMultiByte should always return a From 26854e9c9ee5469474bcaa496b94273082772c18 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 25 Jan 2013 16:47:37 +0200 Subject: [PATCH 2/9] Use file-name-coding-system when decoding symlinks on MS-Windows. src/w32.c (readlink): Use the current file-name-coding-system, not the ANSI codepage, to decode and handle targets of symlinks. --- src/ChangeLog | 2 ++ src/w32.c | 11 +++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 2294a473f53..cd71fa73db0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -2,6 +2,8 @@ * w32.c (w32_get_long_filename, init_environment, readlink): Support file names encoded in DBCS codepages. + (readlink): Use the current file-name-coding-system, not the ANSI + codepage, to decode and handle targets of symlinks. 2013-01-23 Eli Zaretskii diff --git a/src/w32.c b/src/w32.c index 98ec573f553..86b4ea72a22 100644 --- a/src/w32.c +++ b/src/w32.c @@ -4305,6 +4305,8 @@ readlink (const char *name, char *buf, size_t buf_size) WCHAR *lwname_src = reparse_data->SymbolicLinkReparseBuffer.PathBuffer + reparse_data->SymbolicLinkReparseBuffer.PrintNameOffset/sizeof(WCHAR); + /* This updates file_name_codepage which we need below. */ + int dbcs_p = max_filename_mbslen () > 1; /* According to MSDN, PrintNameLength does not include the terminating null character. */ @@ -4312,9 +4314,7 @@ readlink (const char *name, char *buf, size_t buf_size) memcpy (lwname, lwname_src, lwname_len); lwname[lwname_len/sizeof(WCHAR)] = 0; /* null-terminate */ - /* FIXME: Should we use the current file-name coding system - instead of the fixed value of the ANSI codepage? */ - lname_len = WideCharToMultiByte (w32_ansi_code_page, 0, lwname, -1, + lname_len = WideCharToMultiByte (file_name_codepage, 0, lwname, -1, lname, MAX_PATH, NULL, NULL); if (!lname_len) { @@ -4342,12 +4342,11 @@ readlink (const char *name, char *buf, size_t buf_size) size_t size_to_copy = buf_size; BYTE *p = lname, *p2; BYTE *pend = p + lname_len; - int dbcs_p = max_filename_mbslen () > 1; /* Normalize like dostounix_filename does, but we don't want to assume that lname is null-terminated. */ if (dbcs_p) - p2 = CharNextExA (w32_ansi_code_page, p, 0); + p2 = CharNextExA (file_name_codepage, p, 0); else p2 = p + 1; if (*p && *p2 == ':' && *p >= 'A' && *p <= 'Z') @@ -4361,7 +4360,7 @@ readlink (const char *name, char *buf, size_t buf_size) *p = '/'; if (dbcs_p) { - p = CharNextExA (w32_ansi_code_page, p, 0); + p = CharNextExA (file_name_codepage, p, 0); /* CharNextExA doesn't advance at null character. */ if (!*p) break; From 806fed21f15908cee4e3cfdb18e21d988e08ea48 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 26 Jan 2013 14:49:34 +0200 Subject: [PATCH 3/9] Fix bug #13553 with usage of IS_DIRECTORY_SEP on MS-Windows under DBCS. src/w32.c (parse_root, get_volume_info, readdir, read_unc_volume) (logon_network_drive, stat_worker, symlink, chase_symlinks): Use CharNextExA and CharPrevExA to iterate over file names encoded in DBCS. --- src/ChangeLog | 7 ++ src/w32.c | 173 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 158 insertions(+), 22 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index cd71fa73db0..a5108f79f3d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2013-01-26 Eli Zaretskii + + * w32.c (parse_root, get_volume_info, readdir, read_unc_volume) + (logon_network_drive, stat_worker, symlink, chase_symlinks): Use + CharNextExA and CharPrevExA to iterate over file names encoded in + DBCS. (Bug#13553) + 2013-01-25 Eli Zaretskii * w32.c (w32_get_long_filename, init_environment, readlink): diff --git a/src/w32.c b/src/w32.c index 86b4ea72a22..3e300d1b9a3 100644 --- a/src/w32.c +++ b/src/w32.c @@ -1503,12 +1503,17 @@ parse_root (char * name, char ** pPath) else if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1])) { int slashes = 2; + int dbcs_p = max_filename_mbslen () > 1; + name += 2; do { if (IS_DIRECTORY_SEP (*name) && --slashes == 0) break; - name++; + if (dbcs_p) + name = CharNextExA (file_name_codepage, name, 0); + else + name++; } while ( *name ); if (IS_DIRECTORY_SEP (name[0])) @@ -2369,12 +2374,23 @@ get_volume_info (const char * name, const char ** pPath) { char *str = temp; int slashes = 4; + int dbcs_p = max_filename_mbslen () > 1; + rootname = temp; do { if (IS_DIRECTORY_SEP (*name) && --slashes == 0) break; - *str++ = *name++; + if (!dbcs_p) + *str++ = *name++; + else + { + const char *p = name; + + name = CharNextExA (file_name_codepage, name, 0); + memcpy (str, p, name - p); + str += name - p; + } } while ( *name ); @@ -2610,11 +2626,23 @@ readdir (DIR *dirp) { char filename[MAXNAMLEN + 3]; int ln; + int dbcs_p = max_filename_mbslen () > 1; strcpy (filename, dir_pathname); ln = strlen (filename) - 1; - if (!IS_DIRECTORY_SEP (filename[ln])) - strcat (filename, "\\"); + if (!dbcs_p) + { + if (!IS_DIRECTORY_SEP (filename[ln])) + strcat (filename, "\\"); + } + else + { + char *end = filename + ln + 1; + char *last_char = CharPrevExA (file_name_codepage, filename, end, 0); + + if (!IS_DIRECTORY_SEP (*last_char)) + strcat (filename, "\\"); + } strcat (filename, "*"); /* Note: No need to resolve symlinks in FILENAME, because @@ -2719,6 +2747,7 @@ read_unc_volume (HANDLE henum, char *readbuf, int size) DWORD bufsize = 512; char *buffer; char *ptr; + int dbcs_p = max_filename_mbslen () > 1; count = 1; buffer = alloca (bufsize); @@ -2729,7 +2758,13 @@ read_unc_volume (HANDLE henum, char *readbuf, int size) /* WNetEnumResource returns \\resource\share...skip forward to "share". */ ptr = ((LPNETRESOURCE) buffer)->lpRemoteName; ptr += 2; - while (*ptr && !IS_DIRECTORY_SEP (*ptr)) ptr++; + if (!dbcs_p) + while (*ptr && !IS_DIRECTORY_SEP (*ptr)) ptr++; + else + { + while (*ptr && !IS_DIRECTORY_SEP (*ptr)) + ptr = CharNextExA (file_name_codepage, ptr, 0); + } ptr++; strncpy (readbuf, ptr, size); @@ -2766,9 +2801,11 @@ logon_network_drive (const char *path) { NETRESOURCE resource; char share[MAX_PATH]; - int i, n_slashes; + int n_slashes; char drive[4]; UINT drvtype; + char *p; + int dbcs_p; if (IS_DIRECTORY_SEP (path[0]) && IS_DIRECTORY_SEP (path[1])) drvtype = DRIVE_REMOTE; @@ -2790,13 +2827,18 @@ logon_network_drive (const char *path) n_slashes = 2; strncpy (share, path, MAX_PATH); /* Truncate to just server and share name. */ - for (i = 2; i < MAX_PATH; i++) + dbcs_p = max_filename_mbslen () > 1; + for (p = share + 2; *p && p < share + MAX_PATH; ) { - if (IS_DIRECTORY_SEP (share[i]) && ++n_slashes > 3) + if (IS_DIRECTORY_SEP (*p) && ++n_slashes > 3) { - share[i] = '\0'; + *p = '\0'; break; } + if (dbcs_p) + p = CharNextExA (file_name_codepage, p, 0); + else + p++; } resource.dwType = RESOURCETYPE_DISK; @@ -3557,6 +3599,7 @@ stat_worker (const char * path, struct stat * buf, int follow_symlinks) DWORD access_rights = 0; DWORD fattrs = 0, serialnum = 0, fs_high = 0, fs_low = 0, nlinks = 1; FILETIME ctime, atime, wtime; + int dbcs_p; if (path == NULL || buf == NULL) { @@ -3751,6 +3794,7 @@ stat_worker (const char * path, struct stat * buf, int follow_symlinks) did not ask for extra precision, resolving symlinks will fly in the face of that request, since the user then wants the lightweight version of the code. */ + dbcs_p = max_filename_mbslen () > 1; rootdir = (path >= save_name + len - 1 && (IS_DIRECTORY_SEP (*path) || *path == 0)); @@ -3778,8 +3822,19 @@ stat_worker (const char * path, struct stat * buf, int follow_symlinks) } else if (rootdir) { - if (!IS_DIRECTORY_SEP (name[len-1])) - strcat (name, "\\"); + if (!dbcs_p) + { + if (!IS_DIRECTORY_SEP (name[len-1])) + strcat (name, "\\"); + } + else + { + char *end = name + len; + char *n = CharPrevExA (file_name_codepage, name, end, 0); + + if (!IS_DIRECTORY_SEP (*n)) + strcat (name, "\\"); + } if (GetDriveType (name) < 2) { errno = ENOENT; @@ -3791,15 +3846,37 @@ stat_worker (const char * path, struct stat * buf, int follow_symlinks) } else { - if (IS_DIRECTORY_SEP (name[len-1])) - name[len - 1] = 0; + if (!dbcs_p) + { + if (IS_DIRECTORY_SEP (name[len-1])) + name[len - 1] = 0; + } + else + { + char *end = name + len; + char *n = CharPrevExA (file_name_codepage, name, end, 0); + + if (IS_DIRECTORY_SEP (*n)) + *n = 0; + } /* (This is hacky, but helps when doing file completions on network drives.) Optimize by using information available from active readdir if possible. */ len = strlen (dir_pathname); - if (IS_DIRECTORY_SEP (dir_pathname[len-1])) - len--; + if (!dbcs_p) + { + if (IS_DIRECTORY_SEP (dir_pathname[len-1])) + len--; + } + else + { + char *end = dir_pathname + len; + char *n = CharPrevExA (file_name_codepage, dir_pathname, end, 0); + + if (IS_DIRECTORY_SEP (*n)) + len--; + } if (dir_find_handle != INVALID_HANDLE_VALUE && !(is_a_symlink && follow_symlinks) && strnicmp (save_name, dir_pathname, len) == 0 @@ -4060,6 +4137,7 @@ symlink (char const *filename, char const *linkname) char linkfn[MAX_PATH], *tgtfn; DWORD flags = 0; int dir_access, filename_ends_in_slash; + int dbcs_p; /* Diagnostics follows Posix as much as possible. */ if (filename == NULL || linkname == NULL) @@ -4085,6 +4163,8 @@ symlink (char const *filename, char const *linkname) return -1; } + dbcs_p = max_filename_mbslen () > 1; + /* Note: since empty FILENAME was already rejected, we can safely refer to FILENAME[1]. */ if (!(IS_DIRECTORY_SEP (filename[0]) || IS_DEVICE_SEP (filename[1]))) @@ -4099,8 +4179,21 @@ symlink (char const *filename, char const *linkname) char tem[MAX_PATH]; char *p = linkfn + strlen (linkfn); - while (p > linkfn && !IS_ANY_SEP (p[-1])) - p--; + if (!dbcs_p) + { + while (p > linkfn && !IS_ANY_SEP (p[-1])) + p--; + } + else + { + char *p1 = CharPrevExA (file_name_codepage, linkfn, p, 0); + + while (p > linkfn && !IS_ANY_SEP (*p1)) + { + p = p1; + p1 = CharPrevExA (file_name_codepage, linkfn, p1, 0); + } + } if (p > linkfn) strncpy (tem, linkfn, p - linkfn); tem[p - linkfn] = '\0'; @@ -4115,7 +4208,15 @@ symlink (char const *filename, char const *linkname) exist, but ends in a slash, we create a symlink to directory. If FILENAME exists and is a directory, we always create a symlink to directory. */ - filename_ends_in_slash = IS_DIRECTORY_SEP (filename[strlen (filename) - 1]); + if (!dbcs_p) + filename_ends_in_slash = IS_DIRECTORY_SEP (filename[strlen (filename) - 1]); + else + { + const char *end = filename + strlen (filename); + const char *n = CharPrevExA (file_name_codepage, filename, end, 0); + + filename_ends_in_slash = IS_DIRECTORY_SEP (*n); + } if (dir_access == 0 || filename_ends_in_slash) flags = SYMBOLIC_LINK_FLAG_DIRECTORY; @@ -4440,6 +4541,7 @@ chase_symlinks (const char *file) char link[MAX_PATH]; ssize_t res, link_len; int loop_count = 0; + int dbcs_p; if (is_windows_9x () == TRUE || !is_symlink (file)) return (char *)file; @@ -4447,13 +4549,27 @@ chase_symlinks (const char *file) if ((link_len = GetFullPathName (file, MAX_PATH, link, NULL)) == 0) return (char *)file; + dbcs_p = max_filename_mbslen () > 1; target[0] = '\0'; do { /* Remove trailing slashes, as we want to resolve the last non-trivial part of the link name. */ - while (link_len > 3 && IS_DIRECTORY_SEP (link[link_len-1])) - link[link_len--] = '\0'; + if (!dbcs_p) + { + while (link_len > 3 && IS_DIRECTORY_SEP (link[link_len-1])) + link[link_len--] = '\0'; + } + else if (link_len > 3) + { + char *n = CharPrevExA (file_name_codepage, link, link + link_len, 0); + + while (n >= link + 2 && IS_DIRECTORY_SEP (*n)) + { + n[1] = '\0'; + n = CharPrevExA (file_name_codepage, link, n, 0); + } + } res = readlink (link, target, MAX_PATH); if (res > 0) @@ -4466,8 +4582,21 @@ chase_symlinks (const char *file) the symlink, then copy the result back to target. */ char *p = link + link_len; - while (p > link && !IS_ANY_SEP (p[-1])) - p--; + if (!dbcs_p) + { + while (p > link && !IS_ANY_SEP (p[-1])) + p--; + } + else + { + char *p1 = CharPrevExA (file_name_codepage, link, p, 0); + + while (p > link && !IS_ANY_SEP (*p1)) + { + p = p1; + p1 = CharPrevExA (file_name_codepage, link, p1, 0); + } + } strcpy (p, target); strcpy (target, link); } From beb6d07d1005f6dd8a17ba6f3e8406aaf47d5130 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 26 Jan 2013 19:17:11 -0500 Subject: [PATCH 4/9] * lisp/emacs-lisp/cl.el (cl-set-getf): Add compatibility alias. --- lisp/ChangeLog | 4 ++++ lisp/emacs-lisp/cl.el | 1 + 2 files changed, 5 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2a1c5b70199..fa4a85c1ca7 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2013-01-26 Stefan Monnier + + * emacs-lisp/cl.el (cl-set-getf): Add compatibility alias. + 2013-01-24 Fabián Ezequiel Gallina * progmodes/python.el: Enhancements to header documentation about diff --git a/lisp/emacs-lisp/cl.el b/lisp/emacs-lisp/cl.el index 81907f29637..0ad7d4b1592 100644 --- a/lisp/emacs-lisp/cl.el +++ b/lisp/emacs-lisp/cl.el @@ -713,6 +713,7 @@ You can replace this macro with `gv-letplace'." 'cl--map-keymap-recursively "24.3") (define-obsolete-function-alias 'cl-map-intervals 'cl--map-intervals "24.3") (define-obsolete-function-alias 'cl-map-extents 'cl--map-overlays "24.3") +(define-obsolete-function-alias 'cl-set-getf 'cl--set-getf "24.3") (defun cl-maclisp-member (item list) (declare (obsolete member "24.3")) From 224f4ec1298e93e4d18bba7ea208b08c75ae3422 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 27 Jan 2013 10:04:16 +0200 Subject: [PATCH 5/9] Tentative fix for bug #13546 with failure to save files on Windows. src/w32.c (sys_open): Zero out the flags for the new file descriptor. (sys_close): Zero out the flags for the file descriptor before closing it. --- src/ChangeLog | 6 ++++++ src/w32.c | 15 +++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index a5108f79f3d..0fd835747ce 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2013-01-27 Eli Zaretskii + + * w32.c (sys_open): Zero out the flags for the new file descriptor. + (sys_close): Zero out the flags for the file descriptor before + closing it. (Bug#13546) + 2013-01-26 Eli Zaretskii * w32.c (parse_root, get_volume_info, readdir, read_unc_volume) diff --git a/src/w32.c b/src/w32.c index 3e300d1b9a3..802403168f0 100644 --- a/src/w32.c +++ b/src/w32.c @@ -3124,9 +3124,12 @@ sys_open (const char * path, int oflag, int mode) and system files. Force all file handles to be non-inheritable. */ int res = _open (mpath, (oflag & ~_O_CREAT) | _O_NOINHERIT, mode); - if (res >= 0) - return res; - return _open (mpath, oflag | _O_NOINHERIT, mode); + if (res < 0) + res = _open (mpath, oflag | _O_NOINHERIT, mode); + if (res >= 0 && res < MAXDESC) + fd_info[res].flags = 0; + + return res; } int @@ -6135,15 +6138,15 @@ sys_close (int fd) } } + if (fd >= 0 && fd < MAXDESC) + fd_info[fd].flags = 0; + /* Note that sockets do not need special treatment here (at least on NT and Windows 95 using the standard tcp/ip stacks) - it appears that closesocket is equivalent to CloseHandle, which is to be expected because socket handles are fully fledged kernel handles. */ rc = _close (fd); - if (rc == 0 && fd < MAXDESC) - fd_info[fd].flags = 0; - return rc; } From 268c041e440dacf5f897149d6be9edfaa40d86ed Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Sun, 27 Jan 2013 16:34:22 -0800 Subject: [PATCH 6/9] Sync Version: headers with -version variables --- lisp/cedet/cedet.el | 2 +- lisp/cedet/inversion.el | 2 +- lisp/cedet/semantic.el | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/cedet/cedet.el b/lisp/cedet/cedet.el index ccc75a40f4b..d876b65303c 100644 --- a/lisp/cedet/cedet.el +++ b/lisp/cedet/cedet.el @@ -4,7 +4,7 @@ ;; Author: David Ponce ;; Maintainer: Eric M. Ludlam -;; Version: 1.0pre7 +;; Version: 1.1 ;; Keywords: OO, lisp ;; This file is part of GNU Emacs. diff --git a/lisp/cedet/inversion.el b/lisp/cedet/inversion.el index bebb7b58e40..533d959f6b7 100644 --- a/lisp/cedet/inversion.el +++ b/lisp/cedet/inversion.el @@ -3,7 +3,7 @@ ;;; Copyright (C) 2002-2003, 2005-2013 Free Software Foundation, Inc. ;; Author: Eric M. Ludlam -;; Version: 0.2 +;; Version: 1.3 ;; Keywords: OO, lisp ;; This file is part of GNU Emacs. diff --git a/lisp/cedet/semantic.el b/lisp/cedet/semantic.el index 73d0860c49f..decd3b15812 100644 --- a/lisp/cedet/semantic.el +++ b/lisp/cedet/semantic.el @@ -4,7 +4,7 @@ ;; Author: Eric M. Ludlam ;; Keywords: syntax tools -;; Version: 2.0 +;; Version: 2.1beta ;; This file is part of GNU Emacs. From e44970863d763264189e7ab98d6991a38dc95dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A1n=20Ezequiel=20Gallina?= Date: Mon, 28 Jan 2013 18:59:42 -0300 Subject: [PATCH 7/9] * progmodes/python.el (python-shell-parse-command): Find python-shell-interpreter with modified environment. --- lisp/ChangeLog | 5 +++++ lisp/progmodes/python.el | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index fa4a85c1ca7..26ad7ec799a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2013-01-28 Fabián Ezequiel Gallina + + * progmodes/python.el (python-shell-parse-command): Find + python-shell-interpreter with modified environment. + 2013-01-26 Stefan Monnier * emacs-lisp/cl.el (cl-set-getf): Add compatibility alias. diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index c321714e2f1..71c5ba57fa0 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1654,7 +1654,11 @@ uniqueness for different types of configurations." (defun python-shell-parse-command () "Calculate the string used to execute the inferior Python process." - (format "%s %s" python-shell-interpreter python-shell-interpreter-args)) + (let ((process-environment (python-shell-calculate-process-environment)) + (exec-path (python-shell-calculate-exec-path))) + (format "%s %s" + (executable-find python-shell-interpreter) + python-shell-interpreter-args))) (defun python-shell-calculate-process-environment () "Calculate process environment given `python-shell-virtualenv-path'." From 1886a16d27ed4a3ade3f07800797322bfd3468cd Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Tue, 29 Jan 2013 23:46:28 -0800 Subject: [PATCH 8/9] * imenu.el (imenu-default-create-index-function): Put back a version of the infinite loop test removed 2013-01-23. --- lisp/ChangeLog | 5 +++++ lisp/imenu.el | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 26ad7ec799a..aaa01698f12 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2013-01-30 Glenn Morris + + * imenu.el (imenu-default-create-index-function): + Put back a version of the infinite loop test removed 2013-01-23. + 2013-01-28 Fabián Ezequiel Gallina * progmodes/python.el (python-shell-parse-command): Find diff --git a/lisp/imenu.el b/lisp/imenu.el index b72cbeb42b4..0b5d69d6233 100644 --- a/lisp/imenu.el +++ b/lisp/imenu.el @@ -678,11 +678,13 @@ The alternate method, which is the one most often used, is to call ;; in these major modes. But save that change for later. (cond ((and imenu-prev-index-position-function imenu-extract-index-name-function) - (let ((index-alist '()) (pos (point)) + (let ((index-alist '()) (pos -1) name) (goto-char (point-max)) ;; Search for the function (while (funcall imenu-prev-index-position-function) + (when (= pos (point)) + (error "Infinite loop at %s:%d: imenu-prev-index-position-function does not move point" (buffer-name) pos)) (setq pos (point)) (save-excursion (setq name (funcall imenu-extract-index-name-function))) From fe93f41aa0f701315884bf0f8d2cbc6a9f914209 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Tue, 29 Jan 2013 23:47:11 -0800 Subject: [PATCH 9/9] ChangeLog date fix --- lisp/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index aaa01698f12..41c5c7d1671 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -18757,7 +18757,7 @@ * nxml/rng-xsd.el (rng-xsd-check-pattern): Use case-sensitive matching (Bug#8516). -2011-01-22 Jari Aalto +2011-05-22 Jari Aalto * vc/vc-dir.el (vc-default-dir-printer): Give edited tag a different face (Bug#8178).